Compare commits

...
Author SHA1 Message Date
Milan Hanajik ab44e39754 Reconfigured for iPearlSpecial-Camera 2018-06-20 11:02:34 +02:00
Milan Hanajik 324be83f9b Bug fix in diverter. 2018-06-20 11:02:16 +02:00
Milan Hanajik ea8d4cb63d Petersburg components updated (20.06.2018). 2018-06-20 10:38:15 +02:00
Milan Hanajik 7b5231af80 GraphLib : (1) Playback removed, (2) Precision timer removed. 2018-06-20 10:38:14 +02:00
Milan Hanajik 63b7b83363 Refactoring, clean-up, comments, fix in control preventing MainWnd designer to open, ver. 2.18.933 2018-06-20 10:36:52 +02:00
Milan Hanajik 7a814c2a00 Bug fix in TBF.BenchControl.Sequences.SequenceBase.Transition(...), ver. 2.18.931 2018-06-19 13:48:56 +02:00
Milan Hanajik 76053d466b Use of remote database for procedures/tests, part 2. 2018-06-19 09:25:24 +02:00
Milan Hanajik 6020d6e4eb BenchInfo.Polska removed (replaced by BenchInfo.Extended). 2018-06-19 09:24:26 +02:00
Milan Hanajik 61d06dc910 BenchInfo.Extended.Component added, generic BenchControl.Configs.ParamsProvider.ComponentCfgCtrl added. 2018-06-18 17:13:13 +02:00
Milan Hanajik e889215cf4 IParamsProvider.UpdateParam(...) returns CfgUpdateFlags now. 2018-06-18 16:45:32 +02:00
Milan Hanajik cdc971f733 public enum CfgUpdateFlags moved to Config.Enums 2018-06-18 14:44:52 +02:00
Milan Hanajik 863856d27d ComponentCfgBase and derived classes : portected XmlSerializer GetSerializer() --> public XmlSerializer GetSerializer(). 2018-06-18 12:44:37 +02:00
Milan Hanajik cf5dd8cb71 Sharing procedures from a remote DB, ver. 2.18.928 2018-06-15 14:31:40 +02:00
Milan Hanajik 619c06a511 SENTEC: StateMachine.Period = 2s, ver. 2.18.927 2018-06-15 08:57:11 +02:00
Milan Hanajik 9b85630405 ver. 2.18.926 2018-06-14 13:58:36 +02:00
Milan Hanajik 078dc08ed0 Test name cannot contain characters \ / : * ? " < > | (like a file name), ver. 2.18.925 2018-06-14 13:56:43 +02:00
Milan Hanajik f82658cee2 (1) diverter fixed for Badger-velka-trat, (2) power user 'leos' deleted, ver. 2.18.923 2018-06-13 07:35:47 +02:00
Milan Hanajik 7c2135a8fe Bug fixes in reading diverters: ReadDiverterTransitionOp, Elde.Diverter.Component, IControlCOm, IDiverter. 2018-06-12 17:07:15 +02:00
Milan Hanajik b5383a445e Preparation for remote sharing of procedures, ver. 2.18.920 2018-06-11 12:53:52 +02:00
Milan Hanajik f3c0da79e8 (1) Graphs : DivSamples on test START and END, (2) div. transition times calculated from samples. 2018-06-11 12:52:08 +02:00
Milan Hanajik c4c221f58c TestRslt.IsRelErrTest() / IsPMaxTest() / IsStartStop() / IsDiverter() modified and used differently in WMeterRsltItemSpec, ver. 2.18.917 2018-06-08 09:56:52 +02:00
Milan Hanajik 2a622d4aa2 RegisterReaders.SerialStream : Bug fix in DatastreamFrame in case of TiemFieldFormat == FieldFormat.None, ver. 2.18.916 2018-06-06 11:18:30 +02:00
Milan Hanajik baa67cfe02 Change in MainSeq reverted so that transition sequence after test is executed on Stop. ver. 2.18.915 2018-06-06 09:50:52 +02:00
Milan Hanajik d0cddd072c (1) Timeout when setting flow handled as UiCmdStop, (2) RegValve.SetFlowOp cleanup, (3) minor change in RegReaders.SerStream, ver. 2.18.914 2018-06-05 14:21:03 +02:00
Milan Hanajik e20a95029c Bug in UI in ProcedureDlg when the last test is deleted fixed, ver. 2.18.913 2018-06-04 13:53:06 +02:00
Milan Hanajik 392a02b83c (1) IDatastreamReader iface in IperlHead and SerialStream, (2) SerialStream buffer size, (3) TimeFieldFormat==FieldFormat.None implemented, ver. 2.18.911 2018-06-04 08:15:27 +02:00
Milan Hanajik 385825c9e8 Progress bar bug fix for repeated tests. 2018-06-01 13:58:59 +02:00
Milan Hanajik acb5491225 DatastreamFrame logging fixed, FrameFormat handling improved, PD log file names fixed, ver. 2.18.910 2018-06-01 13:21:11 +02:00
Milan Hanajik 5d4dedcb25 RegisterReaders.SerialStream component added, to be tested, ver. 2.18.909 2018-06-01 09:52:24 +02:00
Milan Hanajik 775af25d1b Clean-up, more comments. 2018-05-31 19:04:01 +02:00
Milan Hanajik c4e4bb2e77 SENTEC component upgraded (30.05.2018), ver. 2.18.907 2018-05-30 18:28:16 +02:00
Milan Hanajik 7e2781148e MettlerToledo.Standard : EmptyUp parameter added, used in IsEmpty(.), etc. 2018-05-30 12:57:11 +02:00
Milan Hanajik dd851fb344 (1) SENTEC component (24.05.18), (2) SENTEC defines, (3) RegulValve modified for SENTEC, (4) message box shown in case of a fatal error on start-up, ver. 2.18.906 2018-05-30 12:56:45 +02:00
Milan Hanajik 531a728b37 ver. 2.18.904 2018-05-25 09:04:11 +02:00
Milan Hanajik f10c5797bb ver. 2.18.903 2018-05-25 08:48:47 +02:00
Milan Hanajik 052f39d330 (1) ProcedureDlg and TestParamsCtrl improvements and cleanup, (2) related changes in test methods, ver. 2.18.902 2018-05-24 13:20:03 +02:00
Milan Hanajik 2e593d11eb (1) Results are redrawn when iPerlCommForm is closed, (2) 'Stop draining' is password protected, (3) PW-s updated, ver. 2.18.901 2018-05-21 16:45:54 +02:00
Milan Hanajik e150624f4d Bug fixes in DataEntry.Standard6.TestStartEndForm, more logging, ver. 2.18.899 2018-05-18 16:30:59 +02:00
Milan Hanajik ca9d83e424 ver. 2.18.898 2018-05-18 10:57:17 +02:00
Milan Hanajik 3b1544b330 ver. 2.18.897 2018-05-18 09:58:49 +02:00
Milan Hanajik 518a1f792c Heat meters fixes. 2018-05-18 08:33:45 +02:00
Milan Hanajik 2f3b09ffc5 UpgradeSelectionDlg : (1) upgradeDb_NFC_button_Click( ) added, (2) upgradeDb_218_219_Button_Click( ) completed, ver. 2.18.896 2018-05-17 17:22:50 +02:00
Milan Hanajik d9c60584eb Smart card reader detection embedded inside try { ... } catch( ), ver. 2.18.895 2018-05-17 11:06:57 +02:00
Milan Hanajik d8e0772a0f ZAMBIA define and packages/ControlBoard/Zambia/... component added, ver. 2.18.894 2018-05-17 09:00:08 +02:00
Milan Hanajik 875caf0e28 (1) Smart card reader support, (2) Tag added to User DB table, (3) Graphs : Y-label fixed, two significant digits, ver. 2.18.893 2018-05-15 17:37:05 +02:00
Milan Hanajik 86601e1ba1 BugFix in ...Elde.StartMeasurementOp for the case of RV=...Elde.RegulValveCoax.RegulValve 2018-05-14 16:03:02 +02:00
Milan Hanajik 67a762e51c MettlerToledo.Standard : Timeout in ReadMassOp and ReadStableMassOp, ver. 2.18.892 2018-05-14 10:41:03 +02:00
Milan Hanajik d6881bfdf3 (1) ParamsProvider-s added to C..Test/C..Procedure entities, (2) ComponentCfgBase fn-s returning IParamsProvider rewritten, (3) refactoring, ver. 2.18.891 2018-05-11 16:51:07 +02:00
Milan Hanajik 878c89591e Bug fixes: (1) in MainWnd when proc. added to empty DB, (2) in TestParamsCtrl when a test added and moved up, (3) other minor, (4) ItemNr of editted procedure displayed almost always, ver. 2.18.890 2018-05-02 15:52:53 +02:00
Milan Hanajik f332fd7141 FlyingStartMassCollection and FlyingStart : Case when there is one or no pulse from the water meter handled correctly. 2018-04-27 13:52:06 +02:00
Milan Hanajik bb3be1c649 Results.Entities.TestRslt.ConstMasterRaw added, set to outPath.FlowMeter.LtrPerPulse in sequences 2018-04-27 11:00:05 +02:00
Milan Hanajik e88175b349 (1) Output.DB.SaveFlowmeterCorrections: date, validity, certificate, (2) Flow_ctv, Flow_ctv_min, ... 2018-04-25 12:49:07 +02:00
Milan Hanajik c0f4c5acef (1) Multiple start valves, test methods modified, (2) Component for JuznaAfrika50 (25.04.2018), ver. 2.18.887 2018-04-25 12:47:33 +02:00
Milan Hanajik 1f9df9bb67 (1) Units : lpp,dm3pp,lpdeg,dm3pdeg added, (2) Bug fix in WMRsltItemSpec(ItemID.P_delta_mean_from_up_down_per_mtr, ... , ver. 2.18.884 2018-04-19 14:42:42 +02:00
Milan Hanajik de4a0c61b9 More italian, ver. 2.18.882 2018-04-18 11:34:15 +02:00
Milan Hanajik 0f3f54f8d0 ver. 2.18.881 2018-04-17 23:49:36 +02:00
Milan Hanajik 60f7fbe4c3 More logging, Italian, quantities with units in many languages, etc., ver. 2.18.880 2018-04-17 23:28:00 +02:00
Milan Hanajik 37e84ee678 SMAT Torino PT50 component upgraded (17.04.2018). 2018-04-17 23:19:41 +02:00
Milan Hanajik 04878cea50 Config.Entities.Medium : ToDescription() used in UI, Strings.cold/hot removed, gorjaca->ciepla, ver.2.19.879 2018-04-17 09:04:32 +02:00
Milan Hanajik 7c940bd633 ver. 2.18.878 2018-04-16 15:53:42 +02:00
Milan Hanajik 5769b6ad48 Bug fixes: (1) OnePerMeter : 'WaterMeters[0]' used instead of 'wm', (2) Printers.Table : last vertical line, ver. 2.18.877 2018-04-15 12:19:06 +02:00
Milan Hanajik b17d710044 Results.Entities.WaterMetrData.Medium added, woda zimna/goraca, ver. 2.18.876 2018-04-15 11:34:07 +02:00
Milan Hanajik 441601bd42 iPerl : Default calibration factors modified, ver. 2.18.875 2018-04-12 15:46:12 +02:00
Milan Hanajik d1f5bd8300 New result items, tau_ss fixed (Kepno). 2018-04-12 14:27:13 +02:00
Milan Hanajik 98c1194e5b Bug fix in Sequences.MainSeq.RestoreBatchResults. 2018-04-12 12:42:11 +02:00
Milan Hanajik 85f2f31469 (1) Output.Printers.OnePerMeter : Table{s} centered horizontally on pages, (2) Indicators for PL: "brak" 2018-04-11 15:09:58 +02:00
Milan Hanajik fe3867bc5c ver. 2.18.872 2018-04-11 14:14:32 +02:00
Milan Hanajik b2e467714e Output.Priters.OnePerMeter : 2ng page table position fixed. 2018-04-11 13:50:01 +02:00
Milan Hanajik 0993716c8e (1) TBF.BenchControl.Formulas --> Config.Formulas, (2) MeterTestRslt.RegReaderType, (3) Rslt.items added, (4) Quantity.Pulses, ver. 2.18.870 2018-04-11 11:11:45 +02:00
Milan Hanajik c19802fa13 UpgradeSelectionDlg : upgradeDb_218_219_Button added. 2018-04-11 09:00:44 +02:00
Milan Hanajik efa5084d8b Results.Output.Printers.Table supports separator row line (TODO: separator column line). 2018-04-09 17:43:08 +02:00
Milan Hanajik 673e04a1b6 Renamed: Reference_pulses --> Reference_pulses_ni, Added: Reference_pulses, Test_time_ni, Separator. 2018-04-09 16:40:14 +02:00
Milan Hanajik a4a589a40c Cleanup : Results/ItemSpec, ResultsPrinters/Cevak/... removed, etc., ver. 2.18.869 2018-04-09 13:44:28 +02:00
Milan Hanajik 0436906a59 Elde.StopPreviousOp modified : STOP command resent if necessary, ver. 2.18.868 2018-04-09 10:59:40 +02:00
Milan Hanajik f2a3c47cf7 WMeterRsltItemSpec and Units modified (Kepno), ver. 2.18.867 2018-04-04 16:00:50 +02:00
Milan Hanajik 80db263929 (1) Printers.OnePerMeter with 3 columns above and below the body, (2) static Table Create_xy(...) introduced, ver. 2.18.866 2018-04-04 13:56:23 +02:00
Milan Hanajik 701c2f33bb ErrorFlagsEx water meter results item, ver. 2.18.864 2018-03-28 16:58:36 +02:00
Milan Hanajik dd8dce1d59 try { ... } catch when copying images. 2018-03-28 13:40:02 +02:00
Milan Hanajik cd1bee1018 IControlCom : Interface uses uint[8] filterConstants (Juzna Afrika, Genesis), ver. 2.18.861 2018-03-27 13:16:54 +02:00
Milan Hanajik 3f9312a606 ver. 2.18.860 2018-03-26 16:19:06 +02:00
Milan Hanajik f2c7b9904b ver. 2.18.859 2018-03-26 16:04:25 +02:00
Milan Hanajik 9ac7f691e0 iPerlCommunicationForm bug fix, ver. 2.18.858 2018-03-26 14:17:51 +02:00
Milan Hanajik bf1da91018 (1) Support for JUZNA_AFRIKA_50 symbol added, (2) Component JuznaAfrika50/ControlComponent3U added, ver. 2.18.857 2018-03-26 12:47:46 +02:00
Milan Hanajik 3f8fc9475a ver. 2.18.856 2018-03-26 10:57:59 +02:00
Milan Hanajik 72c3006c8a ResultsBrowser : Export of statistics, ver. 2.18.856 2018-03-25 21:55:18 +02:00
461 changed files with 12448 additions and 8415 deletions
+2
View File
@@ -4,6 +4,8 @@ DeviceTest/bin/
DeviceTest/obj/
Dirichlet.Numerics/bin
Dirichlet.Numerics/obj
GemCard/bin
GemCard/obj
GraphLib/bin
GraphLib/obj
MonitoringDB/bin
+5 -2
View File
@@ -18,7 +18,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;MUNICH</DefineConstants>
<DefineConstants>TRACE;DEBUG;TURA_SPECIAL;IPERL;ORACLE_DB;LANG_SK</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
@@ -28,7 +28,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;MUNICH</DefineConstants>
<DefineConstants>TRACE;TURA_SPECIAL;IPERL;ORACLE_DB;LANG_SK</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
@@ -77,6 +77,7 @@
<Compile Include="Entities\IHasItemNr.cs" />
<Compile Include="Entities\IHasName.cs" />
<Compile Include="Entities\IHasValves.cs" />
<Compile Include="Entities\IParamsProvider.cs" />
<Compile Include="Entities\MeasurementCorrection.cs" />
<Compile Include="Entities\MetersPath.cs" />
<Compile Include="Entities\OutputPath.cs" />
@@ -91,6 +92,7 @@
<Compile Include="Entities\Watermeter.cs" />
<Compile Include="Entities\WMType.cs" />
<Compile Include="FluentCommon.cs" />
<Compile Include="Formulas.cs" />
<Compile Include="Mappings\BenchPathMap.cs" />
<Compile Include="Mappings\ComponentMap.cs" />
<Compile Include="Mappings\ComponentProcedureMap.cs" />
@@ -117,6 +119,7 @@
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
<Compile Include="Units.cs" />
<Compile Include="Utils.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Strings.cs.resx" />
+3 -3
View File
@@ -32,7 +32,7 @@ namespace Config
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
#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;
@@ -50,8 +50,8 @@ namespace Config
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif TURA_SPECIAL
public const int WMsCount = 6;
#elif TURA_SPECIAL || SENTEC
public const int WMsCount = 6;
public const int LineSize = 6;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
+28 -11
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.IO;
@@ -13,13 +13,25 @@ namespace Config.Entities
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)
{
ComponentProcedure result = new ComponentProcedure();
result.CmpntName = CmpntName;
result.Parameters = Parameters;
result.Procedure = newProcedure;
return result;
return new ComponentProcedure(CmpntName, Parameters, newProcedure);
}
public virtual void Export(StreamWriter output)
@@ -34,11 +46,16 @@ namespace Config.Entities
if (string.IsNullOrEmpty(firstLine)) return null;
ComponentProcedure result = new ComponentProcedure();
result.CmpntName = firstLine;
result.Parameters = input.ReadLine().Replace("~", Environment.NewLine);
result.Procedure = newProcedure;
return result;
try
{
string cmptnName = firstLine;
string parameters = input.ReadLine().Replace("~", Environment.NewLine);
return new ComponentProcedure(cmptnName, parameters, newProcedure);
}
catch (Exception)
{
return null;
}
}
}
}
+28 -11
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.IO;
@@ -13,13 +13,25 @@ namespace Config.Entities
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()
{
ComponentTest result = new ComponentTest();
result.CmpntName = CmpntName;
result.Parameters = Parameters;
result.Test = Test;
return result;
return new ComponentTest(CmpntName, Parameters, Test);
}
public virtual void Export(StreamWriter output)
@@ -34,11 +46,16 @@ namespace Config.Entities
if (string.IsNullOrEmpty(firstLine)) return null;
ComponentTest result = new ComponentTest();
result.CmpntName = firstLine;
result.Parameters = input.ReadLine().Replace("~", Environment.NewLine);
result.Test = newTest;
return result;
try
{
string cmptnName = firstLine;
string parameters = input.ReadLine().Replace("~", Environment.NewLine);
return new ComponentTest(cmptnName, parameters, newTest);
}
catch (Exception)
{
return null;
}
}
}
}
+54 -3
View File
@@ -38,6 +38,29 @@ namespace Config.Entities
}
}
/// <summary>
/// Flags returned by each device configuration control Verify(...) function.
/// </summary>
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,
}
public enum ProcedureState
{
Active,
@@ -80,9 +103,17 @@ namespace Config.Entities
public enum Medium
{
[Description("")] NotSpecified,
ColdWater,
HotWater,
[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
}
@@ -156,6 +187,17 @@ namespace Config.Entities
Count
}
/// <summary> Register reader type </summary>
public enum RegisterReaderType
{
Unknown,
Pulses, /// Sick, optical and similar
Camera, /// CLP1611
DataStream, /// iPerl
Manual, /// Entered by human via form (also from camera images)
Count
}
/// <summary> Transition step is finished when this condition is fulfilled </summary>
public enum StepCondition
{
@@ -381,6 +423,15 @@ namespace Config.Entities
[Description("Bottom")] Bottom,
}
public enum TableForm
{
None,
Rows,
Columns,
ColumnsPL,
Count,
}
public enum ImageRotation
{
[Description("0 deg")] None,
@@ -1,10 +1,19 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
namespace TBF.BenchControl.Generic
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace Config.Entities
{
public interface IParamsProvider
{
/// <summary>
/// Get XML Serializer
/// </summary>
XmlSerializer GetSerializer();
string ComponentName { get; }
/// <summary>
@@ -13,13 +22,19 @@ namespace TBF.BenchControl.Generic
int ParamsCount();
/// <summary>
/// Parameter names
/// Returns a parameter name
/// </summary>
/// <param name="ix">Zero based index of the parameter</param>
string ParamName(int ix);
/// <summary>
/// Returns a list of possible values of one parameter (ComboBox when editing) or null (Textbox when editing).
/// </summary>
/// <param name="ix">Zero based index of the parameter</param>
IList<string> ParamValues(int ix);
/// <summary>
/// Parameter values in string form
/// Returns a parameter value in the string form
/// </summary>
/// <param name="ix">Zero based index of the parameter</param>
string ToString(int ix);
@@ -43,9 +58,9 @@ namespace TBF.BenchControl.Generic
/// </summary>
/// <param name="ix">Zero based index of the parameter</param>
/// <param name="strValue">String representation of the parameter</param>
void UpdateParam(int ix, string strValue);
CfgUpdateFlags UpdateParam(int ix, string strValue);
void UpdateDbEntity();
void UpdateEmbeddedDbEntity();
/// <summary>
/// Creates an object copy
+9
View File
@@ -225,6 +225,15 @@ namespace Config.Entities
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);
+9
View File
@@ -301,6 +301,15 @@ namespace Config.Entities
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)
+6 -1
View File
@@ -39,7 +39,11 @@ namespace Config
dbType = Data.CurrentBench.WaterMetersDBSettings.DbType;
connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString;
break;
}
case Users.Entities.DBKind.RemoteConfig:
dbType = Data.CurrentBench.UsersDBSettings.DbType;
connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString;
break;
}
return CreateSessionFactory(database, dbType, connectionString, false);
}
@@ -69,6 +73,7 @@ namespace Config
{
default:
case Users.Entities.DBKind.Config:
case Users.Entities.DBKind.RemoteConfig:
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
break;
case Users.Entities.DBKind.Results:
@@ -1,11 +1,11 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using log4net;
namespace TBF.BenchControl
namespace Config
{
public static class Formulas
{
@@ -153,10 +153,9 @@ namespace TBF.BenchControl
/// </summary>
/// <param name="t">Temperature in [°C]</param>
/// <returns>Density in [kg/m3]</returns>
public static double WaterDensityFromTemp(double t)
public static double WaterDensityFromTemp(double t, double realDensity, double atTemperature)
{
return DistilledWaterDensityFromTemp(t) +
DensityCorrection(Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature);
return DistilledWaterDensityFromTemp(t) + DensityCorrection(realDensity, atTemperature);
}
/// <summary>
@@ -164,7 +163,7 @@ namespace TBF.BenchControl
/// </summary>
/// <param name="t">Temperature in [°C]</param>
/// <returns>Density in [kg/m3]</returns>
public static double WaterDensityFromTempPress(double temp, double pressure)
public static double WaterDensityFromTempPress(double temp, double pressure, double realDensity, double atTemperature)
{
double x0 = 5.08821E-10;
double x1 = 1.2639418;
@@ -174,7 +173,7 @@ namespace TBF.BenchControl
double theta = temp / 100.0;
double B = x0 * (((x3 * theta + x2) * theta + x1) * theta + 1) / (1 + x4 * theta);
return WaterDensityFromTemp(temp) * (1 + B * Config.Units.ConvertTo(Config.Unit.Pa, pressure));
return WaterDensityFromTemp(temp, realDensity, atTemperature) * (1 + B * Config.Units.ConvertTo(Config.Unit.Pa, pressure));
}
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 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.837.0")]
[assembly: AssemblyFileVersion("2.18.837.0")]
[assembly: AssemblyVersion("2.18.928.0")]
[assembly: AssemblyFileVersion("2.18.928.0")]
+82 -7
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2016-2017 Sensus Slovensko a.s.
/// Copyright (c) 2016-2018 Sensus Slovensko a.s.
///
using System;
using System.Reflection;
@@ -11,6 +11,12 @@ namespace Config
{
[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
@@ -62,9 +68,28 @@ namespace Config
[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
}
@@ -84,6 +109,7 @@ namespace Config
[Description("Länge")] Length,
[Description("Dichte")] Density,
[Description("Energie")] Energy,
[Description("Impulse")] Pulses,
[Description("Impulse/l")] PulsePerLtr,
[Description("Impulse/kWh")] PulsePerKWh,
@@ -93,7 +119,7 @@ namespace Config
[Description("Boolean")] Boolean,
[Description("Datum und Uhrzeit")] DateTime,
#elif LANG_PL
[Description("Objętość")] Volume,
[Description("Objętość")] Volume,
[Description("Przepływ")] Flow,
[Description("Masa")] Mass,
[Description("Czas")] Time,
@@ -104,6 +130,7 @@ namespace Config
[Description("Długość")] Length,
[Description("Gęstość")] Density,
[Description("Energia")] Energy,
[Description("Impulsy")] Pulses,
[Description("Impulsy/litr")] PulsePerLtr,
[Description("Impulsy/kWh")] PulsePerKWh,
@@ -124,6 +151,7 @@ namespace Config
[Description("Délka")] Length,
[Description("Hustota")] Density,
[Description("Energie")] Energy,
[Description("Pulzy")] Pulses,
[Description("Pulzy/litr")] PulsePerLtr,
[Description("Pulzy/kWh")] PulsePerKWh,
@@ -132,8 +160,29 @@ namespace Config
[Description("Text")] String,
[Description("Boolean")] Boolean,
[Description("Datum a čas")] DateTime,
#else
#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,
@@ -144,6 +193,7 @@ namespace Config
[Description("Length")] Length,
[Description("Density")] Density,
[Description("Energy")] Energy,
[Description("Pulses")] Pulses,
[Description("Pulses/liter")] PulsePerLtr,
[Description("Pulses/kWh")] PulsePerKWh,
@@ -153,7 +203,7 @@ namespace Config
[Description("Boolean")] Boolean,
[Description("Date and time")] DateTime,
#endif
Count,
Count,
}
public static class Units
@@ -178,6 +228,10 @@ namespace Config
{
switch (units)
{
case Unit.pulse:
case Unit.degree:
return Config.Quantity.Pulses;
case Unit.l:
case Unit.dm3:
case Unit.m3:
@@ -241,9 +295,17 @@ namespace Config
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:
@@ -262,6 +324,7 @@ namespace Config
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); }
@@ -329,7 +392,13 @@ namespace Config
case Unit.kWh: return v / 3600000.0; /// 1 kWh = 3600000 J
case Unit.MWh: return v / 3600000000.0;/// 1 MWh = 3600000000 J
default: return v;
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;
}
}
@@ -396,7 +465,13 @@ namespace Config
case Unit.kWh: return 3600000 * v; /// 1 kWh = 3600000 J
case Unit.MWh: return 3600000000 * v; /// 1 kWh = 3600000000 J
default: return v;
case Unit.kWhpp:
case Unit.lpp:
case Unit.dm3pp:
case Unit.lpdeg:
case Unit.dm3pdeg: return ((v == 0) ? 0 : 1 / v);
default: return v;
}
}
}
+69
View File
@@ -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";
}
}
}
}
+94
View File
@@ -0,0 +1,94 @@
using System;
using System.Text;
namespace GemCard
{
/// <summary>
/// This class represents a command APDU
/// </summary>
public class APDUCommand
{
/// <summary>
/// Minimun size of an APDU command in bytes
/// </summary>
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
/// <summary>
/// Constructor
/// </summary>
/// <param name="bCla">Class byte</param>
/// <param name="bIns">Instruction byte</param>
/// <param name="bP1">Parameter P1 byte</param>
/// <param name="bP2">Parameter P2 byte</param>
/// <param name="baData">Data to send to the card if any, null if no data to send</param>
/// <param name="bLe">Number of data expected, 0 if none</param>
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;
}
/// <summary>
/// Update the current APDU with selected parameters
/// </summary>
/// <param name="apduParam">APDU parameters</param>
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;
}
/// <summary>
/// Overrides the ToString method to format to a string the APDUCommand object
/// </summary>
/// <returns></returns>
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();
}
}
}
+147
View File
@@ -0,0 +1,147 @@
using System;
namespace GemCard
{
/// <summary>
/// This class is used to update a set of parameters of an APDUCommand object
/// </summary>
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;
/// <summary>
/// Resets the current instance, all flags are set to false
/// </summary>
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();
}
/// <summary>
/// Copy constructor (used for cloning)
/// </summary>
/// <param name="param"></param>
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
/// <summary>
/// Clones the current APDUParam instance
/// </summary>
/// <returns></returns>
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
}
}
+74
View File
@@ -0,0 +1,74 @@
using System;
using System.Text;
namespace GemCard
{
/// <summary>
/// This class represents the APDU response sent by the card
/// </summary>
public class APDUResponse
{
/// <summary>
/// Status bytes length
/// </summary>
public const int SW_LENGTH = 2;
/// <summary>
/// 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
/// </summary>
public byte[] Data;
public byte SW1;
public byte SW2;
/// <summary>
/// Status get property
/// </summary>
public ushort Status
{
get { return (ushort)(((short)SW1 << 8) + (short)SW2); }
}
/// <summary>
/// Constructor from the byte data sent back by the card
/// </summary>
/// <param name="baData">Buffer of data from the card</param>
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];
}
/// <summary>
/// Overrides the ToString method to format to a string the APDUResponse object
/// </summary>
/// <returns></returns>
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;
}
}
}
}
+58
View File
@@ -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\<configuration>. 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("")]
+162
View File
@@ -0,0 +1,162 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace GemCard
{
/// <summary>
/// Values for AttrId of SCardGetAttrib
/// </summary>
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); } }
}
/// <summary>
/// Abstract class that adds a basic event management to the ICard interface.
/// </summary>
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;
/// <summary>
/// Event handler for the card insertion
/// </summary>
public event EventHandler<CardInsertedEventArgs> OnCardInserted = null;
/// <summary>
/// Event handler for the card removal
/// </summary>
public event EventHandler<CardRemovedEventArgs> 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
/// <summary>
/// This method should start a thread that checks for card insertion or removal
/// </summary>
/// <param name="Reader"></param>
public void StartCardEvents(string Reader)
{
if (m_thread == null)
{
m_bRunCardDetection = true;
m_thread = new Thread(new ParameterizedThreadStart(RunCardDetection));
m_thread.Start(Reader);
}
}
/// <summary>
/// Stops the card events thread
/// </summary>
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;
}
}
/// <summary>
/// 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()
///
/// </summary>
/// <param name="Reader">Name of the reader to scan for card event</param>
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
}
}
+173
View File
@@ -0,0 +1,173 @@
using System;
using System.Runtime.InteropServices;
using SCARDSSPLib;
using GemCardExLib;
namespace GemCard
{
/// <summary>
/// Implements the ICard interface using the SCard COM objects from Microsoft and SCardDatabaseEx object
/// for the ListReaders function.
/// </summary>
public class CardCOM : CardBase
{
private ISCard m_itfCard = null;
/// <summary>
/// Default constructor
/// </summary>
public CardCOM()
{
// Create the SCard object
m_itfCard = new CSCardClass();
}
#region ICard Members
/// <summary>
/// Wraps the PCSC function
/// LONG SCardListReaders(SCARDCONTEXT hContext,
/// LPCTSTR mszGroups,
/// LPTSTR mszReaders,
/// LPDWORD pcchReaders
/// );
/// </summary>
/// <returns>A string array of the readers</returns>
public override string[] ListReaders()
{
ISCardDatabaseEx itfCardBase = new SCardDatabaseEx();
return (string[]) itfCardBase.ListReaders();
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardConnect(
/// IN SCARDCONTEXT hContext,
/// IN LPCTSTR szReader,
/// IN DWORD dwShareMode,
/// IN DWORD dwPreferredProtocols,
/// OUT LPSCARDHANDLE phCard,
/// OUT LPDWORD pdwActiveProtocol
/// );
/// </summary>
/// <param name="Reader"></param>
/// <param name="ShareMode"></param>
/// <param name="PreferredProtocols"></param>
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);
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardDisconnect(
/// IN SCARDHANDLE hCard,
/// IN DWORD dwDisposition
/// );
/// </summary>
/// <param name="Disposition"></param>
public override void Disconnect(DISCONNECT Disposition)
{
// Off the connection with the card
m_itfCard.Detach((SCARD_DISPOSITIONS) Disposition);
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardTransmit(
/// SCARDHANDLE hCard,
/// LPCSCARD_I0_REQUEST pioSendPci,
/// LPCBYTE pbSendBuffer,
/// DWORD cbSendLength,
/// LPSCARD_IO_REQUEST pioRecvPci,
/// LPBYTE pbRecvBuffer,
/// LPDWORD pcbRecvLength
/// );
/// </summary>
/// <param name="ApduCmd">APDUCommand object with the APDU to send to the card</param>
/// <returns>An APDUResponse object with the response from the card</returns>
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);
}
/// <summary>
/// Wraps the PSCS function
/// LONG SCardBeginTransaction(
/// SCARDHANDLE hCard
// );
/// This function is not supported in the COM implementation
/// </summary>
public override void BeginTransaction()
{
throw new NotImplementedException("BeginTransaction is not supported in the COM implementation");
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardEndTransaction(
/// SCARDHANDLE hCard,
/// DWORD dwDisposition
/// );
/// This function is not supported in the COM implementation
/// </summary>
/// <param name="Disposition">A value from DISCONNECT enum</param>
public override void EndTransaction(DISCONNECT Disposition)
{
throw new NotImplementedException("EndTransaction is not supported in the COM implementation");
}
/// <summary>
/// Gets the attributes of the card
/// </summary>
/// <param name="AttribId">Identifier for the Attribute to get</param>
/// <returns>Attribute content</returns>
public override byte[] GetAttribute(UInt32 AttribId)
{
throw new NotImplementedException();
}
#endregion
/// <summary>
/// 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()
///
/// </summary>
protected override void RunCardDetection(object Reader)
{
throw new Exception("The method or operation is not implemented.");
}
}
}
+9
View File
@@ -0,0 +1,9 @@
using System;
namespace GemCard
{
public class CardInsertedEventArgs : EventArgs
{
public CardInsertedEventArgs() { }
}
}
+620
View File
@@ -0,0 +1,620 @@
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace GemCard
{
/// <summary>
/// CARD_STATE enumeration, used by the PC/SC function SCardGetStatusChanged
/// </summary>
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
}
/// <summary>
/// Wraps the SCARD_IO_STRUCTURE
///
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct SCard_IO_Request
{
public UInt32 m_dwProtocol;
public UInt32 m_cbPciLength;
}
/// <summary>
/// Wraps theSCARD_READERSTATE structure of PC/SC
/// </summary>
[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;
}
/// <summary>
/// Implementation of ICard using native (P/Invoke) interoperability for PC/SC
/// </summary>
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
/// <summary>
/// Native SCardGetStatusChanged from winscard.dll
/// </summary>
/// <param name="hContext"></param>
/// <param name="dwTimeout"></param>
/// <param name="rgReaderStates"></param>
/// <param name="cReaders"></param>
/// <returns></returns>
[DllImport("winscard.dll", SetLastError = true)]
internal static extern int SCardGetStatusChange(UInt32 hContext,
UInt32 dwTimeout,
[In,Out] SCard_ReaderState[] rgReaderStates,
UInt32 cReaders);
/// <summary>
/// Native SCardListReaders function from winscard.dll
/// </summary>
/// <param name="hContext"></param>
/// <param name="mszGroups"></param>
/// <param name="mszReaders"></param>
/// <param name="pcchReaders"></param>
/// <returns></returns>
[DllImport("winscard.dll", SetLastError=true)]
internal static extern int SCardListReaders(UInt32 hContext,
[MarshalAs(UnmanagedType.LPTStr)] string mszGroups,
IntPtr mszReaders,
out UInt32 pcchReaders);
/// <summary>
/// Native SCardEstablishContext function from winscard.dll
/// </summary>
/// <param name="dwScope"></param>
/// <param name="pvReserved1"></param>
/// <param name="pvReserved2"></param>
/// <param name="phContext"></param>
/// <returns></returns>
[DllImport("winscard.dll", SetLastError=true)]
internal static extern int SCardEstablishContext(UInt32 dwScope,
IntPtr pvReserved1,
IntPtr pvReserved2,
IntPtr phContext);
/// <summary>
/// Native SCardReleaseContext function from winscard.dll
/// </summary>
/// <param name="hContext"></param>
/// <returns></returns>
[DllImport("winscard.dll", SetLastError=true)]
internal static extern int SCardReleaseContext(UInt32 hContext);
/// <summary>
/// Native SCardConnect function from winscard.dll
/// </summary>
/// <param name="hContext"></param>
/// <param name="szReader"></param>
/// <param name="dwShareMode"></param>
/// <param name="dwPreferredProtocols"></param>
/// <param name="phCard"></param>
/// <param name="pdwActiveProtocol"></param>
/// <returns></returns>
[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);
/// <summary>
/// Native SCardDisconnect function from winscard.dll
/// </summary>
/// <param name="hCard"></param>
/// <param name="dwDisposition"></param>
/// <returns></returns>
[DllImport("winscard.dll", SetLastError=true)]
internal static extern int SCardDisconnect(UInt32 hCard,
UInt32 dwDisposition);
/// <summary>
/// Native SCardTransmit function from winscard.dll
/// </summary>
/// <param name="hCard"></param>
/// <param name="pioSendPci"></param>
/// <param name="pbSendBuffer"></param>
/// <param name="cbSendLength"></param>
/// <param name="pioRecvPci"></param>
/// <param name="pbRecvBuffer"></param>
/// <param name="pcbRecvLength"></param>
/// <returns></returns>
[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
);
/// <summary>
/// Native SCardBeginTransaction function of winscard.dll
/// </summary>
/// <param name="hContext"></param>
/// <returns></returns>
[DllImport("winscard.dll", SetLastError = true)]
internal static extern int SCardBeginTransaction(UInt32 hContext);
/// <summary>
/// Native SCardEndTransaction function of winscard.dll
/// </summary>
/// <param name="hContext"></param>
/// <returns></returns>
[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
/// <summary>
/// Default constructor
/// </summary>
public CardNative()
{
}
/// <summary>
/// Object destruction
/// </summary>
~CardNative()
{
Disconnect(DISCONNECT.Unpower);
ReleaseContext();
}
#region ICard Members
/// <summary>
/// Wraps the PCSC function
/// LONG SCardListReaders(SCARDCONTEXT hContext,
/// LPCTSTR mszGroups,
/// LPTSTR mszReaders,
/// LPDWORD pcchReaders
/// );
/// </summary>
/// <returns>A string array of the readers</returns>
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;
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardEstablishContext(
/// IN DWORD dwScope,
/// IN LPCVOID pvReserved1,
/// IN LPCVOID pvReserved2,
/// OUT LPSCARDCONTEXT phContext
/// );
/// </summary>
/// <param name="Scope"></param>
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);
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardReleaseContext(
/// IN SCARDCONTEXT hContext
/// );
/// </summary>
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;
}
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardConnect(
/// IN SCARDCONTEXT hContext,
/// IN LPCTSTR szReader,
/// IN DWORD dwShareMode,
/// IN DWORD dwPreferredProtocols,
/// OUT LPSCARDHANDLE phCard,
/// OUT LPDWORD pdwActiveProtocol
/// );
/// </summary>
/// <param name="Reader"></param>
/// <param name="ShareMode"></param>
/// <param name="PreferredProtocols"></param>
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);
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardDisconnect(
/// IN SCARDHANDLE hCard,
/// IN DWORD dwDisposition
/// );
/// </summary>
/// <param name="Disposition"></param>
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();
}
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardTransmit(
/// SCARDHANDLE hCard,
/// LPCSCARD_I0_REQUEST pioSendPci,
/// LPCBYTE pbSendBuffer,
/// DWORD cbSendLength,
/// LPSCARD_IO_REQUEST pioRecvPci,
/// LPBYTE pbRecvBuffer,
/// LPDWORD pcbRecvLength
/// );
/// </summary>
/// <param name="ApduCmd">APDUCommand object with the APDU to send to the card</param>
/// <returns>An APDUResponse object with the response from the card</returns>
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);
}
/// <summary>
/// Wraps the PSCS function
/// LONG SCardBeginTransaction(
/// SCARDHANDLE hCard
// );
/// </summary>
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);
}
}
}
/// <summary>
/// Wraps the PCSC function
/// LONG SCardEndTransaction(
/// SCARDHANDLE hCard,
/// DWORD dwDisposition
/// );
/// </summary>
/// <param name="Disposition">A value from DISCONNECT enum</param>
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);
}
}
}
/// <summary>
/// Gets the attributes of the card
/// </summary>
/// <param name="AttribId">Identifier for the Attribute to get</param>
/// <returns>Attribute content</returns>
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
/// <summary>
/// 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()
///
/// </summary>
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);
}
}
}
+9
View File
@@ -0,0 +1,9 @@
using System;
namespace GemCard
{
public class CardRemovedEventArgs : EventArgs
{
public CardRemovedEventArgs() { }
}
}
+194
View File
@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{8B10D15A-39DE-4B56-8DD1-710C1EB3A697}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<AssemblyName>GemCard</AssemblyName>
<AssemblyOriginatorKeyFile>
</AssemblyOriginatorKeyFile>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<DelaySign>false</DelaySign>
<OutputType>Library</OutputType>
<RootNamespace>GemCard</RootNamespace>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<StartupObject>
</StartupObject>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>bin\Debug\</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>true</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<NoStdLib>false</NoStdLib>
<NoWarn>
</NoWarn>
<Optimize>false</Optimize>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>false</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<NoStdLib>false</NoStdLib>
<NoWarn>
</NoWarn>
<Optimize>true</Optimize>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<BaseAddress>285212672</BaseAddress>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<FileAlignment>4096</FileAlignment>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<BaseAddress>285212672</BaseAddress>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<FileAlignment>4096</FileAlignment>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>
<ItemGroup>
<Reference Include="System">
<Name>System</Name>
</Reference>
<Reference Include="System.Data">
<Name>System.Data</Name>
</Reference>
<Reference Include="System.Xml">
<Name>System.XML</Name>
</Reference>
<COMReference Include="GemCardExLib">
<Guid>{F1FF634B-BEDF-461C-A409-5B88E05F5117}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
<COMReference Include="SCARDSSPLib">
<Guid>{82C38704-19F1-11D3-A11F-00C04F79F800}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
</COMReference>
<COMReference Include="stdole">
<Guid>{00020430-0000-0000-C000-000000000046}</Guid>
<VersionMajor>2</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
</COMReference>
</ItemGroup>
<ItemGroup>
<Compile Include="APDUCommand.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="APDUParam.cs" />
<Compile Include="APDUResponse.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="CardBase.cs" />
<Compile Include="CardInsertedEventArgs.cs" />
<Compile Include="CardNative.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="CardRemovedEventArgs.cs" />
<Compile Include="ICard.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="SmartCardException.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>
+70
View File
@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LastOpenVersion>8.0.50215</LastOpenVersion>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ReferencePath>
</ReferencePath>
<CopyProjectDestinationFolder>
</CopyProjectDestinationFolder>
<CopyProjectUncPath>
</CopyProjectUncPath>
<CopyProjectOption>0</CopyProjectOption>
<ProjectView>ProjectFiles</ProjectView>
<ProjectTrust>0</ProjectTrust>
<PublishUrlHistory />
<InstallUrlHistory />
<SupportUrlHistory />
<UpdateUrlHistory />
<BootstrapperUrlHistory />
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<EnableASPDebugging>false</EnableASPDebugging>
<EnableASPXDebugging>false</EnableASPXDebugging>
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
<EnableSQLServerDebugging>false</EnableSQLServerDebugging>
<RemoteDebugEnabled>false</RemoteDebugEnabled>
<RemoteDebugMachine>
</RemoteDebugMachine>
<StartAction>Project</StartAction>
<StartArguments>
</StartArguments>
<StartPage>
</StartPage>
<StartProgram>
</StartProgram>
<StartURL>
</StartURL>
<StartWorkingDirectory>
</StartWorkingDirectory>
<StartWithIE>true</StartWithIE>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<EnableASPDebugging>false</EnableASPDebugging>
<EnableASPXDebugging>false</EnableASPXDebugging>
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
<EnableSQLServerDebugging>false</EnableSQLServerDebugging>
<RemoteDebugEnabled>false</RemoteDebugEnabled>
<RemoteDebugMachine>
</RemoteDebugMachine>
<StartAction>Project</StartAction>
<StartArguments>
</StartArguments>
<StartPage>
</StartPage>
<StartProgram>
</StartProgram>
<StartURL>
</StartURL>
<StartWorkingDirectory>
</StartWorkingDirectory>
<StartWithIE>false</StartWithIE>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<StartWithIE>true</StartWithIE>
</PropertyGroup>
</Project>
+149
View File
@@ -0,0 +1,149 @@
using System;
namespace GemCard
{
/// <summary>
/// This interface gives access to the basic card functions. It must be implemented by a class.
/// </summary>
public interface ICard
{
/// <summary>
/// Wraps the PCSC funciton
/// LONG SCardListReaders(SCARDCONTEXT hContext,
/// LPCTSTR mszGroups,
/// LPTSTR mszReaders,
/// LPDWORD pcchReaders
/// );
/// </summary>
/// <returns>A string array of the readers</returns>
string[] ListReaders();
/// <summary>
/// Wraps the PCSC function
/// LONG SCardConnect(
/// IN SCARDCONTEXT hContext,
/// IN LPCTSTR szReader,
/// IN DWORD dwShareMode,
/// IN DWORD dwPreferredProtocols,
/// OUT LPSCARDHANDLE phCard,
/// OUT LPDWORD pdwActiveProtocol
/// );
/// </summary>
/// <param name="Reader"></param>
/// <param name="ShareMode"></param>
/// <param name="PreferredProtocols"></param>
void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols);
/// <summary>
/// Wraps the PCSC function
/// LONG SCardDisconnect(
/// IN SCARDHANDLE hCard,
/// IN DWORD dwDisposition
/// );
/// </summary>
/// <param name="Disposition"></param>
void Disconnect(DISCONNECT Disposition);
/// <summary>
/// Wraps the PCSC function
/// LONG SCardTransmit(
/// SCARDHANDLE hCard,
/// LPCSCARD_I0_REQUEST pioSendPci,
/// LPCBYTE pbSendBuffer,
/// DWORD cbSendLength,
/// LPSCARD_IO_REQUEST pioRecvPci,
/// LPBYTE pbRecvBuffer,
/// LPDWORD pcbRecvLength
/// );
/// </summary>
/// <param name="ApduCmd">APDUCommand object with the APDU to send to the card</param>
/// <returns>An APDUResponse object with the response from the card</returns>
APDUResponse Transmit(APDUCommand ApduCmd);
/// <summary>
/// Wraps the PSCS function
/// LONG SCardBeginTransaction(
/// SCARDHANDLE hCard
// );
/// </summary>
void BeginTransaction();
/// <summary>
/// Wraps the PCSC function
/// LONG SCardEndTransaction(
/// SCARDHANDLE hCard,
/// DWORD dwDisposition
/// );
/// </summary>
void EndTransaction(DISCONNECT Disposition);
/// <summary>
/// Gets the attributes of the card
/// </summary>
/// <param name="AttribId">Identifier for the Attribute to get</param>
/// <returns>Attribute content</returns>
byte[] GetAttribute(UInt32 AttribId);
}
/// <summary>
/// SCOPE context
/// </summary>
public enum SCOPE
{
/// <summary>
/// The context is a user context, and any database operations are performed within the
/// domain of the user.
/// </summary>
User,
/// <summary>
/// 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.)
/// </summary>
Terminal,
/// <summary>
/// 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.)
/// </summary>
System
}
/// <summary>
/// SHARE mode enumeration
/// </summary>
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.
}
/// <summary>
/// PROTOCOL enumeration
/// </summary>
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.
}
/// <summary>
/// DISCONNECT action enumeration
/// </summary>
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
}
}
+40
View File
@@ -0,0 +1,40 @@
using System;
namespace GemCard
{
/// <summary>
/// Smart card exceptions
/// </summary>
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)
{
}
}
}
-1
View File
@@ -75,7 +75,6 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="PrecisionTimer.cs" />
<Compile Include="Utils.cs" />
</ItemGroup>
<ItemGroup>
+1 -107
View File
@@ -43,11 +43,6 @@ namespace GraphLib
PlotterGraphSelectCurvesForm GraphPropertiesForm = null;
PrintPreviewForm printPreviewForm = null;
private PrecisionTimer.Timer mTimer = null;
private float play_speed = 0.5f;
private float play_speed_max = 10f;
private float play_speed_min = 0.5f;
private bool paused = false;
private bool isRunning = false;
@@ -58,11 +53,6 @@ namespace GraphLib
public PlotterDisplayEx()
{
InitializeComponent();
mTimer = new PrecisionTimer.Timer();
mTimer.Period = 50; // 20 fps
mTimer.Tick += new EventHandler(OnTimerTick);
play_speed = 0.5f; // 20x10 = 200 values per second == sample frequency
mTimer.Start();
isRunning = false;
}
@@ -192,85 +182,10 @@ namespace GraphLib
protected override void Dispose(bool disposing)
{
paused = true;
if (mTimer.IsRunning)
{
mTimer.Stop();
mTimer.Dispose();
}
paused = true;
base.Dispose(disposing);
}
public void Start()
{
if (isRunning == false && paused == false)
{
gPane.starting_idx = 0;
paused = false;
isRunning = true;
// mTimer.Start();
tb1.Buttons[0].ImageIndex = 2;
}
else
{
if (paused == false)
{
//mTimer.Stop();
paused = true;
}
else
{
// mTimer.Start();
paused = false;
}
if (paused)
{
tb1.Buttons[0].ImageIndex = 0;
}
else
{
tb1.Buttons[0].ImageIndex = 2;
}
}
}
public void Stop()
{
if (isRunning)
{
// mTimer.Stop();
isRunning = false;
paused = false;
hScrollBar1.Value = 0;
tb1.Buttons[0].ImageIndex = 0;
}
}
private void tb1_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
{
bool pushed = e.Button.Pushed;
switch (e.Button.Tag.ToString().ToLower())
{
case "play":
Start();
break;
case "stop":
Stop();
break;
}
}
private void SetPlayPanelVisible()
{
panel1.Visible = true;
@@ -317,27 +232,6 @@ namespace GraphLib
{
}
}
private void UpdatePlayback()
{
if (!paused && isRunning == true)
{
try
{
gPane.starting_idx += play_speed;
UpdateScrollBar();
gPane.Invalidate();
}
catch { }
}
}
private void OnTimerTick(object sender, EventArgs e)
{
UpdateControl();
UpdatePlayback();
}
private void UpdateScrollBar()
{
-1
View File
@@ -57,7 +57,6 @@ namespace GraphLib
this.tb1.Size = new System.Drawing.Size(80, 26);
this.tb1.TabIndex = 1;
this.tb1.Visible = false;
this.tb1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tb1_ButtonClick);
//
// tbbSave
//
-490
View File
@@ -1,490 +0,0 @@
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);
}
}
/// <summary>
/// Gets or sets the object used to marshal event-handler calls.
/// </summary>
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();
}
}
}
/// <summary>
/// Gets a value indicating whether the Timer is running.
/// </summary>
public bool IsRunning
{
get
{
return running;
}
}
/// <summary>
/// Gets the timer capabilities.
/// </summary>
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)
{
}
}
}
+8 -8
View File
@@ -296,13 +296,13 @@ namespace Results
ISession session = DB.CreateSession();
if (session == null) return null;
TestDataList = session.QueryOver<TestData>().List();
ComponentsList = session.QueryOver<Components>().List();
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
try
{
batches = session.QueryOver<Batch>()
TestDataList = session.QueryOver<TestData>().List();
ComponentsList = session.QueryOver<Components>().List();
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
batches = session.QueryOver<Batch>()
.Where(x => (x.BatchNr == batchNr))
.List();
@@ -315,14 +315,14 @@ namespace Results
.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;
}
return (batches.Count > 0) ? batches[0] : null;
}
}
}
+7 -2
View File
@@ -10,7 +10,7 @@ namespace Results.Entities
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 string RegReaderClass { get; set; } /// Not mapped to the DB, does not depent on localisation and customer
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)
@@ -75,6 +75,11 @@ namespace Results.Entities
(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());
@@ -99,7 +104,7 @@ namespace Results.Entities
if (src == null) return;
CompoundMeterId = src.CompoundMeterId;
RegReaderClass = src.RegReaderClass;
RegReaderType = src.RegReaderType;
PulsesMeter = src.PulsesMeter;
PulsesMaster = src.PulsesMaster;
PulsesPerLiter = src.PulsesPerLiter;
+14 -3
View File
@@ -26,8 +26,9 @@ namespace Results.Entities
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 ConstMaster { get; set; } /// [pls/l] Pulses per liter master flow meter
public virtual double MassStartRaw { get; set; } /// [kg]
public virtual double ConstMasterRaw { get; set; } /// [l/pls] Liters per pulse of the master flow meter uncorrected
public virtual double ConstMaster { get; set; } /// [l/pls] Liters per pulse of the master flow meter
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]
@@ -128,6 +129,10 @@ namespace Results.Entities
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()
{
@@ -212,6 +217,7 @@ namespace Results.Entities
FlowSetTime = src.FlowSetTime;
TestTime = src.TestTime;
PulsesMaster = src.PulsesMaster;
ConstMasterRaw = src.ConstMasterRaw;
ConstMaster = src.ConstMaster;
MassStartRaw = src.MassStartRaw;
MassStart = src.MassStart;
@@ -302,7 +308,12 @@ namespace Results.Entities
/// <summary> Wrapper </summary>
public virtual string ErrorFlagsStr()
{
return Utils.ErrorFlagsStr(ErrorFlags);
string eFlags = Utils.ErrorFlagsStr(ErrorFlags);
#if LANG_PL
return string.IsNullOrEmpty(eFlags) ? "brak" : eFlags;
#else
return eFlags;
#endif
}
public override string ToString()
+42 -2
View File
@@ -130,10 +130,48 @@ namespace Results.Entities
return (errorFlagsMode != ErrorFlagsMode.Off) ? (eFlagsFromTests | ErrorFlags) : 0;
}
public virtual string ErrorFlagstStr()
/// <summary>
/// Convert combined errorFlags of all tests to string
/// </summary>
/// <returns>ErrorFlags string</returns>
public virtual string ErrorFlagsStr()
{
ErrorFlagsMode errorFlagsMode;
return Utils.ErrorFlagsStr(ErrorFlagsFromTestsAndWM(out 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;
}
/// <summary>
/// Convert failed tests and combined errorFlags of all tests to string
/// </summary>
/// <returns>ErrorFlagsEx string</returns>
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()
@@ -177,6 +215,8 @@ namespace Results.Entities
}
///
/// Not mapped to the database
///
+4
View File
@@ -41,6 +41,8 @@ namespace Results.Entities
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; }
@@ -96,6 +98,8 @@ namespace Results.Entities
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;
+35 -3
View File
@@ -56,7 +56,7 @@ namespace Results
Flow_profile_sensitivity_class, /// 46
Approval_info, /// 47
Certificate, /// 48
Pulses_per_liter, /// 49
Pulses_per_liter, /// 49 Water meter constant (water meter data, not used in calculations)
Text1, /// 50
Text2, /// 51
Text3, /// 52
@@ -68,8 +68,8 @@ namespace Results
WM_Position, /// 58
End_state, /// 59
Pulses, /// 60
Pulses__liter, /// 61
Reference_pulses, /// 62
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
@@ -220,6 +220,38 @@ namespace Results
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
Count,
}
}
-244
View File
@@ -1,244 +0,0 @@
///
/// 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); } }
/// <summary> Safe wrapper which replaces null-s by empty strings </summary>
public string Print(MeterTestRslt meterTestRslt)
{
string str = null;
if (printDlgt != null) str = printDlgt(meterTestRslt);
return (str == null) ? string.Empty : str;
}
/// <summary> Safe wrapper which replaces null-s by empty strings </summary>
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;
}
/// <summary> Safe wrapper which replaces null-s by empty strings </summary>
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<ItemSpec> AllItems;
/// Static constructor that initializes the list of all items
static ItemSpec()
{
AllItems = new List<ItemSpec>();
/// 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.DensityLine().ToString("F1"), (x, y, z) => z.DensityLine().ToString("F1"), (x, z) => z.DensityLine().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<ItemSpec> 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<ItemSpec> FromStrArray(string[] strArray)
{
IList<ItemSpec> result = new List<ItemSpec>();
if (strArray != null)
{
for (int i = 0; i < strArray.Length; i++)
{
ItemSpec item = GetItem(strArray[i]);
if (item != null) result.Add(item);
}
}
return result;
}
}
}
@@ -1,446 +0,0 @@
///
/// 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;
/// <summary>
/// Property variable for the Font the user wishes to use
/// </summary>
Font font;
Font boldFont;
Font titleFont;
///
/// Data to print
///
Results.Entities.Batch batch;
string testBenchName;
string address1;
///
/// Items to print
///
readonly IList<Results.ItemSpec> 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
/// <summary>
/// Constructor
/// </summary>
/// <param name="textToPrint">Text to be printed</param>
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;
}
/// <summary>
/// Override the default onbeginPrint method of the PrintDocument Object
/// </summary>
/// <param name=e></param>
/// <remarks></remarks>
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); }
}
/// <summary>
/// Override the default OnPrintPage method of the PrintDocument.
/// </summary>
/// <param name=e></param>
/// <remarks>This provides the print logic for our document</remarks>
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;
}
}
}
/// <summary>
/// Print one water meter results
/// </summary>
/// <param name="wm">Water meter</param>
/// <param name="printedWMNr">Number of the water meter printed</param>
/// <param name="top">Top coordinate of watermeter data</param>
/// <returns>The height of the printed section</returns>
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);
}
}
}
@@ -183,7 +183,7 @@ namespace Results.Output.Printers.Enhanced
commonHeight = commonItems.Count * SpacingOne;
BodyTop = CommonTop + commonHeight + SpacingOne4Header;
Table table0 = GetTable_TestsAreRows(batch.WaterMeters[0], testItems, style);
Table table0 = Table.Create_TestsAreRows(batch.WaterMeters[0], testItems, style);
SizeF tableSize = table0.Measure(e);
int wmSectionHeight = (int)tableSize.Height + 3 * SpacingOne4Header;
@@ -276,7 +276,7 @@ namespace Results.Output.Printers.Enhanced
string.Format(" {0} = {1}", Strings.sn, wm.SerialNr));
}
Table table = GetTable_TestsAreRows(wm, testItems, style);
Table table = Table.Create_TestsAreRows(wm, testItems, style);
return table.Draw(e, leftMargin, top + SpacingOneAndHalf4Header);
}
@@ -313,50 +313,5 @@ namespace Results.Output.Printers.Enhanced
RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Footer);
e.Graphics.DrawString(text, this.footerFont, Brushes.Black, printArea);
}
Table GetTable_TestsAreRows(Results.Entities.WaterMeter wm, IList<WMeterRsltItemSpec> 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;
}
}
}
@@ -29,11 +29,7 @@ namespace Results.Output.Printers.OnePerMeter
readonly int spacingOne;
readonly int spacingOne4Header;
float commonTop; /// = TitleY + 60
float bodyTop; /// = HdrTop + 160
///
float titleHeight;
float commonHeight;
float titleHeight;
/// <summary>
/// Property variable for the Font the user wishes to use
@@ -54,9 +50,14 @@ namespace Results.Output.Printers.OnePerMeter
/// Items to print
///
string header;
IList<WMeterRsltItemSpec> commonItems;
IList<WMeterRsltItemSpec> commonItems1;
IList<WMeterRsltItemSpec> commonItems2;
IList<WMeterRsltItemSpec> commonItems3;
IList<WMeterRsltItemSpec> testItems;
IList<WMeterRsltItemSpec> testItems2;
IList<WMeterRsltItemSpec> belowItems1;
IList<WMeterRsltItemSpec> belowItems2;
IList<WMeterRsltItemSpec> belowItems3;
string footer;
int nrPages;
@@ -78,9 +79,14 @@ namespace Results.Output.Printers.OnePerMeter
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
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
@@ -146,8 +152,12 @@ namespace Results.Output.Printers.OnePerMeter
}
}
float tableTop = cfg.TopMargin;
if (pageNr == 1)
{
/// First page
///
/// Print water meter picture
///
@@ -168,66 +178,156 @@ namespace Results.Output.Printers.OnePerMeter
e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea);
titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height;
commonTop = TitleY + titleHeight + spacingOne4Header;
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);
///
/// Common items
///
Table table = new Table(2);
table.Style = new TableStyle { Font = font, MarginX = 5, MarginY = 3 };
Alignment[] horizAlgn = new Alignment[] { Alignment.Left, Alignment.Left };
VertAlignment[] vertAlgn = new VertAlignment[] { VertAlignment.Top, VertAlignment.Top };
///
foreach (var v in commonItems)
{
string[] row = new string[] { v.Caption, (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty };
table.AddRow(row, horizAlgn, vertAlgn);
}
TableStyle commonTableStyle = new TableStyle { Font = font, MarginX = 5, MarginY = 3 };
bodyTop = table.Draw(e, (float)leftMargin, commonTop) + spacingOne4Header;
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
/// Draw table (on the 1st, as well as on the 2nd page)
///
if (cfg.TestsAreRows)
float belowTop;
TableStyle style;
Table table;
switch (cfg.Form)
{
TableStyle style = new TableStyle
{
Font = font,
HeaderFont = headerFont,
MarginX = 5,
MarginY = 3,
LineWidth = 1,
TopHeadersCount = 1,
HorizLines = TableLines.All,
VertLines = TableLines.FirstSecondAndLast
};
default:
case TableForm.Rows:
GetTable_TestsAreRows(wm, (pageNr == 1) ? testItems : testItems2, style).Draw(e, (float)leftMargin, bodyTop);
}
else
{
TableStyle style = new TableStyle
{
Font = font,
HeaderFont = headerFont,
MarginX = 5,
MarginY = 3,
LineWidth = 1,
LeftHeadersCount = 1,
HorizLines = TableLines.FirstSecondAndLast,
VertLines = TableLines.All
};
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;
GetTable_TestsAreColumns(wm, (pageNr == 1) ? testItems : testItems2, style).Draw(e, (float)leftMargin, bodyTop);
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;
@@ -245,107 +345,5 @@ namespace Results.Output.Printers.OnePerMeter
pageNr++;
}
Table GetTable_TestsAreRows(Results.Entities.WaterMeter wm, IList<WMeterRsltItemSpec> 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;
}
Table GetTable_TestsAreColumns(Results.Entities.WaterMeter wm, IList<WMeterRsltItemSpec> 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;
}
}
}
@@ -27,10 +27,23 @@ namespace Results.Output.Printers.OnePerMeter
public bool SupressPrinting; /// Bypass printing when true
public System.Globalization.CultureInfo CultureInfo;
public string Header; /// =Title
public string[] CommonItems;
public string[] TestItems;
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 string Footer;
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;
+242 -31
View File
@@ -72,10 +72,17 @@ namespace Results.Output.Printers
{
for (int rowIx = 0; rowIx < RowsCount; rowIx++)
{
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;
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)
@@ -86,11 +93,19 @@ namespace Results.Output.Printers
}
for (int rowIx = 0; rowIx < RowsCount; rowIx++)
{
bool hasLineAbove = (Style.HorizLines == TableLines.All)
|| ((Style.HorizLines == TableLines.FirstAndLast) && (rowIx == 0))
|| ((Style.HorizLines == TableLines.FirstSecondAndLast) && (rowIx <= 1));
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;
retVal.Height += rowHeight[rowIx] + (hasLineAbove ? (Style.LineWidth + Style.MarginY) : 0) + Style.MarginY;
}
}
if (Style.VertLines == TableLines.None) retVal.Width -= Style.MarginX;
@@ -123,10 +138,19 @@ namespace Results.Output.Printers
{
for (int rowIx = 0; rowIx < RowsCount; rowIx++)
{
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;
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)
@@ -138,12 +162,23 @@ namespace Results.Output.Printers
}
for (int rowIx = 0; rowIx < RowsCount; rowIx++)
{
bool hasLineAbove = (Style.HorizLines == TableLines.All)
|| ((Style.HorizLines == TableLines.FirstAndLast) && (rowIx == 0))
|| ((Style.HorizLines == TableLines.FirstSecondAndLast) && (rowIx <= 1));
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;
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
@@ -153,7 +188,10 @@ namespace Results.Output.Printers
{
for (int rowIx = 0; rowIx <= RowsCount; rowIx++)
{
if (Style.HorizLines == TableLines.All || rowIx == 0 || rowIx == RowsCount || (Style.HorizLines == TableLines.FirstSecondAndLast && rowIx == 1))
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));
}
@@ -167,7 +205,7 @@ namespace Results.Output.Printers
{
for (int colIx = 0; colIx <= tblColumnsCount; colIx++)
{
if (Style.VertLines == TableLines.All || colIx == 0 || colIx == RowsCount || (Style.VertLines == TableLines.FirstSecondAndLast && colIx == 1))
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));
}
@@ -180,23 +218,196 @@ namespace Results.Output.Printers
for (int rowIndex = 0; rowIndex < RowsCount; rowIndex++)
{
string[] oneTableRow = Rows[rowIndex];
Alignment[] horizAlignment = HorizAlignments[(RowsCount > rowIndex) ? rowIndex : 0];
VertAlignment[] vertAlignment = VertAlignments[(RowsCount > rowIndex) ? rowIndex : 0];
for (int colIndex = 0; colIndex < tblColumnsCount; colIndex++)
if (oneTableRow != null)
{
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]);
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<WMeterRsltItemSpec> 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<WMeterRsltItemSpec> 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<WMeterRsltItemSpec> 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;
}
}
}
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 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.855.0")]
[assembly: AssemblyFileVersion("2.18.855.0")]
[assembly: AssemblyVersion("2.18.918.0")]
[assembly: AssemblyFileVersion("2.18.918.0")]
+9
View File
@@ -1644,6 +1644,15 @@ namespace Results.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Unit.
/// </summary>
internal static string Unit {
get {
return ResourceManager.GetString("Unit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Units.
/// </summary>
+3
View File
@@ -210,4 +210,7 @@
<data name="to" xml:space="preserve">
<value>do</value>
</data>
<data name="Unit" xml:space="preserve">
<value>Jednotka</value>
</data>
</root>
+3
View File
@@ -438,4 +438,7 @@
<data name="to" xml:space="preserve">
<value>do</value>
</data>
<data name="Unit" xml:space="preserve">
<value>Jednostka</value>
</data>
</root>
+3
View File
@@ -720,4 +720,7 @@
<data name="Tooltip_T_ln_st" xml:space="preserve">
<value>Temperature in the line at start of the test – first 4 measurements after the start</value>
</data>
<data name="Unit" xml:space="preserve">
<value>Unit</value>
</data>
</root>
+2 -6
View File
@@ -18,7 +18,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;MUNICH</DefineConstants>
<DefineConstants>TRACE;DEBUG;TURA_SPECIAL;IPERL;ORACLE_DB;LANG_SK</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
@@ -27,7 +27,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;MUNICH</DefineConstants>
<DefineConstants>TRACE;TURA_SPECIAL;IPERL;ORACLE_DB;LANG_SK</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
@@ -97,9 +97,6 @@
<Compile Include="Mappings\TestRsltMap.cs" />
<Compile Include="Mappings\WaterMeterDataMap.cs" />
<Compile Include="Mappings\WaterMeterMap.cs" />
<Compile Include="Output\Printers\Cevak\PrintDocumentCevak.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Output\Printers\Enhanced\EnhancedPrintDocument.cs">
<SubType>Component</SubType>
</Compile>
@@ -120,7 +117,6 @@
</Compile>
<Compile Include="Output\Printers\Zapiska\ZapiskaPrinterCfg.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ItemSpec.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
+1 -106
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2016 Sensus Metering Systems
/// Copyright (c) 2016-2018 Sensus Slovensko a.s.
///
using System;
using System.Text;
@@ -31,110 +31,6 @@ namespace Results
}
}
/// <summary>
/// Converts float number to a string with the specified number of significant digits
/// </summary>
/// <param name="value">Float value to be converted to a string</param>
/// <param name="validDigits">Number of significant digits: 4, 3, or 2 (otherwise a full precision number is printed)</param>
/// <returns>String representation of the float number</returns>
public static string DoubleToStr(double value, int validDigits)
{
if (-float.Epsilon <= value && value <= float.Epsilon)
{
return "0";
}
else if (validDigits == 4)
{
if (value >= 999.5 || value < -999.5) return value.ToString("F0");
else if (value >= 99.95 || value < -99.95) return value.ToString("F1");
else if (value >= 9.995 || value < -9.995) return value.ToString("F2");
else if (value >= 0.9995 || value < -0.9995) return value.ToString("F3");
else if (value >= 0.09995 || value < -0.09995) return value.ToString("F4");
else if (value >= 0.009995 || value < -0.009995) return value.ToString("F5");
else return value.ToString("F6");
}
else if (validDigits == 3)
{
if (value >= 99.5 || value < -99.5) return value.ToString("F0");
else if (value >= 9.95 || value < -9.95) return value.ToString("F1");
else if (value >= 0.995 || value < -0.995) return value.ToString("F2");
else if (value >= 0.0995 || value < -0.0995) return value.ToString("F3");
else if (value >= 0.00995 || value < -0.00995) return value.ToString("F4");
else if (value >= 0.000995 || value < -0.000995) return value.ToString("F5");
else return value.ToString("F6");
}
else if (validDigits == 2)
{
if (value >= 9.5 || value < -9.5) return value.ToString("F0");
else if (value >= 0.95 || value < -0.95) return value.ToString("F1");
else if (value >= 0.095 || value < -0.095) return value.ToString("F2");
else if (value >= 0.0095 || value < -0.0095) return value.ToString("F3");
else if (value >= 0.00095 || value < -0.00095) return value.ToString("F4");
else return value.ToString("F5");
}
else return value.ToString();
}
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";
}
}
/// <summary>
/// Converts ErrorFlags integer to string. Supports up to 31 flags (E1..E31).
@@ -170,6 +66,5 @@ namespace Results
return (useRedGreenColor) ? (passed ? "OK|Green" : "NOK|Red") : (passed ? "OK|White" : "NOK|White");
#endif
}
}
}
+66 -38
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -137,7 +137,8 @@ namespace Results
{
AllItems = new List<WMeterRsltItemSpec>();
AllItems.Add(new WMeterRsltItemSpec(ItemID.String, "String", "", Quantity.String, ItemCategory.Other, (w, t, u, f, p) => f));
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())));
@@ -175,6 +176,7 @@ namespace Results
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
@@ -185,24 +187,39 @@ namespace Results
///
/// Time (duration)
///
AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_time, Strings.T_s + "()", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TestTime)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Diverter_start_time, "Diverter start time ()", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).DiverterStart)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Diverter_end_time, "Diverter end time ()", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).DiverterEnd)));
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.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.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.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 min ()", Strings.VName_Flow), "Mean 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).TestTime == 0) ? 0 : 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
@@ -233,14 +250,14 @@ namespace Results
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) ? "" : (w.GetTestRslt(t).Custom1).ToString(GetPr(p, "F3"))));
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) ? "" : (w.GetTestRslt(t).Custom2).ToString(GetPr(p, "F3"))));
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) ? "" : (w.GetTestRslt(t).Custom3).ToString(GetPr(p, "F3"))));
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) ? "" : ((w.GetTestRslt(t).Custom2 + w.GetTestRslt(t).Custom3) / 2).ToString(GetPr(p, "F3"))));
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) ? "" : (w.GetTestRslt(t).Custom6).ToString(GetPr(p, "F3"))));
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) ? "" : (w.GetTestRslt(t).Custom7).ToString(GetPr(p, "F3"))));
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) ? "" : (w.GetTestRslt(t).Custom8).ToString(GetPr(p, "F3"))));
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) ? "" : ((w.GetTestRslt(t).Custom7 + w.GetTestRslt(t).Custom8) / 2).ToString(GetPr(p, "F3"))));
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
///
@@ -264,6 +281,10 @@ namespace Results
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
@@ -283,14 +304,14 @@ namespace Results
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)));
#if TURA_IPERL || TURA_SPECIAL
#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, string.IsNullOrEmpty(w.ErrorFlagstStr()) ? (w.WaterMeterData.Text4 + w.PassedColorStr()) : w.ErrorFlagstStr()))); /// PL specific result
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
@@ -313,8 +334,7 @@ namespace Results
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.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.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)));
@@ -330,10 +350,17 @@ namespace Results
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.Number, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetMeterTestRslt(t).PulsesMeter)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_pulses, Strings.RefPulses + "()", Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F1", w.GetMeterTestRslt(t).PulsesMaster)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Pulses__liter, Strings.PulsesLiter + "()", Quantity.PulsePerLtr, ItemCategory.Other, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).PulsesPerLiter)));
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)));
@@ -365,8 +392,8 @@ namespace Results
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) ? "" : (w.GetMeterTestRslt(t, Config.Entities.CompoundMeterId.HeatMeterEnergy).VolumeMeter).ToString(GetPr(p, "F1"))));
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) ? "" : (w.GetMeterTestRslt(t, Config.Entities.CompoundMeterId.HeatMeterEnergy).VolumeRef).ToString(GetPr(p, "F1"))));
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
@@ -381,8 +408,9 @@ namespace Results
#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.ErrorFlagstStr())));
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.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));
@@ -437,7 +465,7 @@ namespace Results
int significantDigits;
if (int.TryParse(precision.Substring(1), out significantDigits))
{
precision = Utils.SignificantDigitsToFmt(val, significantDigits);
precision = Config.Utils.SignificantDigitsToFmt(val, significantDigits);
}
}
@@ -475,7 +503,7 @@ namespace Results
int significantDigits;
if (int.TryParse(precision.Substring(1), out significantDigits))
{
precision = Utils.SignificantDigitsToFmt(val1, significantDigits);
precision = Config.Utils.SignificantDigitsToFmt(val1, significantDigits);
}
}
+113 -97
View File
@@ -28,103 +28,118 @@
/// </summary>
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();
((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.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.Location = new System.Drawing.Point(38, 22);
this.printButton.Name = "printButton";
this.printButton.Size = new System.Drawing.Size(108, 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.Location = new System.Drawing.Point(176, 22);
this.closeButton.Name = "closeButton";
this.closeButton.Size = new System.Drawing.Size(108, 41);
this.closeButton.TabIndex = 1;
this.closeButton.Text = "Close";
this.closeButton.UseVisualStyleBackColor = true;
this.closeButton.Click += new System.EventHandler(this.closeButton_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);
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);
}
@@ -135,5 +150,6 @@
private System.Windows.Forms.SplitContainer splitContainer2;
private System.Windows.Forms.Button closeButton;
private System.Windows.Forms.Button printButton;
private System.Windows.Forms.Button exportButton;
}
}
+51
View File
@@ -4,6 +4,7 @@ using System.Windows.Forms;
using Results.Entities;
using ResultsBrowser.Resources;
using ResultsBrowser.Output.Printers.Statistics;
using System.IO;
namespace ResultsBrowser.Forms
{
@@ -217,5 +218,55 @@ namespace ResultsBrowser.Forms
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<MonitoringDB.ItemSpec> 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);
}
}
}
}
}
+3 -3
View File
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sensus")]
[assembly: AssemblyProduct("ResultsBrowser")]
[assembly: AssemblyCopyright("Copyright © 2015 - 2017 Sensus Slovensko a.s.")]
[assembly: AssemblyCopyright("Copyright © 2015 - 2018 Sensus Slovensko a.s.")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 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.851.0")]
[assembly: AssemblyFileVersion("2.18.851.0")]
[assembly: AssemblyVersion("2.18.856.0")]
[assembly: AssemblyFileVersion("2.18.856.0")]
+1 -1
View File
@@ -637,7 +637,7 @@
<value>zimna</value>
</data>
<data name="hot" xml:space="preserve">
<value>gorąca</value>
<value>ciepła</value>
</data>
<data name="Product_name" xml:space="preserve">
<value>Nazwa produktu</value>
+3
View File
@@ -822,4 +822,7 @@
<data name="Printing_completed" xml:space="preserve">
<value>Printing completed</value>
</data>
<data name="Error_exporting_results" xml:space="preserve">
<value>Error exporting results</value>
</data>
</root>
+9
View File
@@ -1014,6 +1014,15 @@ namespace ResultsBrowser.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Error exporting results.
/// </summary>
internal static string Error_exporting_results {
get {
return ResourceManager.GetString("Error_exporting_results", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error loading users from the database:.
/// </summary>
+9 -4
View File
@@ -21,7 +21,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;MUNICH</DefineConstants>
<DefineConstants>TRACE;DEBUG;TURA_SPECIAL;IPERL;ORACLE_DB;LANG_SK</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
@@ -31,7 +31,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;MUNICH</DefineConstants>
<DefineConstants>TRACE;TURA_SPECIAL;IPERL;ORACLE_DB;LANG_SK</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
@@ -207,12 +207,17 @@
<EmbeddedResource Include="Resources\Strings.cs.resx" />
<EmbeddedResource Include="Resources\Strings.de.resx" />
<EmbeddedResource Include="Resources\Strings.it.resx" />
<EmbeddedResource Include="Resources\Strings.pl.resx" />
<EmbeddedResource Include="Resources\Strings.pl.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Strings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Strings1.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Strings.ru.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Strings.ru.resx" />
<EmbeddedResource Include="ResultsBrowserWnd.resx">
<DependentUpon>ResultsBrowserWnd.cs</DependentUpon>
</EmbeddedResource>
+12 -8
View File
@@ -344,13 +344,14 @@ namespace ResultsBrowser
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)
{
using (TextWriter writer = new StreamWriter(dlg.FileName))
{
try
{
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);
@@ -379,14 +380,15 @@ namespace ResultsBrowser
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, Strings.Error_displaying_results, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
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;
@@ -470,6 +472,7 @@ namespace ResultsBrowser
#endif
}
private void statisticsBtn_Click(object sender, EventArgs e)
{
if (waterMeters == null || waterMeters.Count == 0) return;
@@ -494,6 +497,7 @@ namespace ResultsBrowser
statisticsDlg.ShowDialog();
}
/// <summary>
/// Updates component factory
/// </summary>
+20
View File
@@ -28,6 +28,9 @@ 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
@@ -35,9 +38,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserManagement", "UserManag
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
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -154,6 +162,18 @@ Global
{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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
+1 -1
View File
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.Ambient.Comet
public class AmbientCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(AmbientCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new AmbientCfgCtrl(); }
@@ -4,15 +4,13 @@
using System;
using System.Windows.Forms;
using System.IO.Ports;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.Ambient.Comet
{
public partial class AmbientCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(AmbientCfgCtrl));
public bool ShowMore { get { return false; } }
AmbientCfg config;
+1 -1
View File
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.Ambient.Greco
public class AmbientCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(AmbientCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new AmbientCfgCtrl(); }
@@ -4,15 +4,13 @@
using System;
using System.Windows.Forms;
using System.IO.Ports;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.Ambient.Greco
{
public partial class AmbientCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(AmbientCfgCtrl));
public bool ShowMore { get { return false; } }
AmbientCfg config;
@@ -1,6 +1,5 @@
///
/// Copyright (c) 2013-2016 Sensus Metering Systems
/// Author: Milan Hanajík
/// Copyright (c) 2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -10,7 +9,7 @@ using Config.Entities;
using TBF.BenchControl;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.BenchInfo.Polska
namespace TBF.BenchControl.BenchInfo.Extended
{
/// <summary>
/// Holds information identifying the test bench.
@@ -20,10 +19,11 @@ namespace TBF.BenchControl.BenchInfo.Polska
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;
readonly ComponentCfg myCfg;
public string TestBenchName { get { return BenchInfoCfg.TestBenchName; } }
public int TestBenchId { get { return BenchInfoCfg.TestBenchId; } }
public string TestBenchName { get { return myCfg.TestBenchName; } }
public int TestBenchId { get { return myCfg.TestBenchId; } }
public RemoteDBUse RemoteDBUse { get { return myCfg.RemoteDBUse; } }
public Component()
{
@@ -32,7 +32,7 @@ namespace TBF.BenchControl.BenchInfo.Polska
public Component(Generic.IComponentCfg cfg)
: base(cfg)
{
BenchInfoCfg = cfg as ComponentCfg;
myCfg = cfg as ComponentCfg;
log.Debug(this.ToString());
}
}
@@ -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
{
/// <summary>
/// Holds information identifying the test bench - serializable configuration.
/// </summary>
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<string> ParamValues(int i)
{
if (i == 10)
{
IList<string> list = new List<string>();
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
}
}
}
@@ -1,10 +1,10 @@
///
/// Copyright (c) 2015-2016 Sensus Metering Systems
/// Copyright (c) 2018 Sensus Slovensko a.s.
///
using System.Collections.Generic;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.BenchInfo.Polska
namespace TBF.BenchControl.BenchInfo.Extended
{
public class ComponentFactory : IComponentFactory
{
@@ -1,6 +1,5 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Author: Milan Hanajík
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -24,6 +23,7 @@ namespace TBF.BenchControl.BenchInfo.Munich
public string TestBenchName { get { return benchInfoCfg.TestBenchName; } }
public int TestBenchId { get { return benchInfoCfg.TestBenchId; } }
public RemoteDBUse RemoteDBUse { get { return RemoteDBUse.LocalDBOnly; } }
public Component()
{
@@ -15,7 +15,7 @@ namespace TBF.BenchControl.BenchInfo.Munich
public class ComponentCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ComponentCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new ComponentCfgCtrl(); }
@@ -4,7 +4,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
@@ -12,8 +12,6 @@ namespace TBF.BenchControl.BenchInfo.Munich
{
public partial class ComponentCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(ComponentCfgCtrl));
public bool ShowMore { get { return false; } }
ComponentCfg config;
@@ -1,66 +0,0 @@
///
/// 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
{
/// <summary>
/// Holds information identifying the test bench - serializable configuration.
/// </summary>
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);
}
}
}
@@ -1,130 +0,0 @@
///
/// 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;
}
}
}
@@ -1,316 +0,0 @@
///
/// Copyright (c) 2015 Sensus Metering Systems
///
namespace TBF.BenchControl.BenchInfo.Polska
{
partial class ComponentCfgCtrl
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}
+127 -37
View File
@@ -94,7 +94,7 @@ namespace TBF.BenchControl
}
protected virtual XmlSerializer GetSerializer() { return new XmlSerializer(GetType()); }
public virtual XmlSerializer GetSerializer() { return new XmlSerializer(GetType()); }
public Component CreateDbEntity()
{
@@ -124,56 +124,146 @@ namespace TBF.BenchControl
}
}
/// <summary>
/// Default implementation returning null - no test aprameters.
/// In case there are any test parameters, this function override should return
/// a reference to a class that implements IParamsProvider and ITestParams.
/// </summary>
/// <returns>Test parameters obtained by the last UpdateTestParams(test)</returns>
public virtual IParamsProvider GetTestParams()
{
return null;
}
/// <summary>
/// Default implementation returning null - no procedure parameters.
/// In case there are any procedure parameters, this function override should return
/// a reference to a class that implements IParamsProvider and IProcedureParams.
/// </summary>
/// <returns>Procedure parameters obtained by the last UpdateProcedureParams(procedure)</returns>
public virtual IParamsProvider GetProcedureParams()
public void LoadTestParamsFromDB(Test test)
{
return null;
}
public void UpdateTestParams(Test test)
{
ITestParams tstPrms = (GetTestParams() as ITestParams);
ITestParams tstPrms = (GetRuntimeTestParamsProvider() as ITestParams);
if (tstPrms != null)
{
tstPrms.UpdateTestParams(Name, test);
tstPrms.FromDbEntity(Name, test);
}
}
public void UpdateProcedureParams(Procedure procedure)
public void LoadProcedureParamsFromDB(Procedure procedure)
{
IProcedureParams procPrms = (GetProcedureParams() as IProcedureParams);
IProcedureParams procPrms = (GetRuntimeProcParamsProvider() as IProcedureParams);
if (procPrms != null)
{
procPrms.UpdateProcedureParams(Name, procedure);
procPrms.FromDbEntity(Name, procedure);
}
}
public virtual IParamsProvider CreateTestParams(Test test)
{
return null;
}
/// <summary>
/// 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.
/// </summary>
/// <returns>Procedure parameters provider for this component or null</returns>
public virtual IParamsProvider CreateProcParamsProvider()
{
return null;
}
public virtual IParamsProvider CreateProcedureParams(Procedure procedure)
{
return null;
}
/// <summary>
/// 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.
/// </summary>
/// <returns>Procedure parameters provider for this component or null</returns>
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;
}
}
/// <summary>
/// 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.
/// </summary>
/// <returns>Procedure parameters provider for this component or null</returns>
public virtual IParamsProvider CreateTestParamsProvider()
{
return null;
}
/// <summary>
/// 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.
/// </summary>
/// <returns>Test parameters provider for this component or null</returns>
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;
}
}
}
}
@@ -9,7 +9,7 @@ namespace TBF.BenchControl.Configs.NameOnly
public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); }
@@ -3,15 +3,13 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.Configs.NameOnly
{
public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(TestMethodCfgCtrl));
public bool ShowMore { get { return false; } }
TestMethodCfg config;
@@ -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<string> parents;
Control[] editors;
CfgUpdateFlags flags;
public ComponentCfgCtrl()
{
InitializeComponent();
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="paramsProvider">Parameters provider implementing IComponentCfg and IParamsProvider</param>
/// <param name="parents">A list of parents or null, null hides parentComboBox</param>
public ComponentCfgCtrl(IParamsProvider paramsProvider, IList<string> 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<string> 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);
}
}
}
}
@@ -0,0 +1,171 @@
///
/// Copyright (c) 2018 Sensus Slovensko a.s.
///
namespace TBF.BenchControl.Configs.ParamsProvider
{
partial class ComponentCfgCtrl
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}
@@ -44,12 +44,6 @@ namespace TBF.BenchControl.DB.SensusOracle
///
GenericDevices.IRegisterReader[] iperlHeads;
/// <summary>
/// Result items to print
/// </summary>
IList<Results.ItemSpec> rsltItems;
/// <summary>
/// Results to print
/// </summary>
@@ -31,7 +31,7 @@ namespace TBF.BenchControl.DB.SensusOracle
public class DatabaseCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DatabaseCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new DatabaseCfgCtrl(); }
@@ -4,15 +4,13 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.DB.SensusOracle
{
public partial class DatabaseCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(DatabaseCfgCtrl));
public bool ShowMore { get { return false; } }
DatabaseCfg config;
+1 -1
View File
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.Danfoss.VLT2800
public class PumpCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PumpCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new PumpCfgCtrl(); }
@@ -4,15 +4,13 @@
using System;
using System.Windows.Forms;
using System.IO.Ports;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.Danfoss.VLT2800
{
public partial class PumpCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(PumpCfgCtrl));
public bool ShowMore { get { return false; } }
PumpCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.Combined
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,7 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
@@ -11,8 +11,6 @@ namespace TBF.BenchControl.DataEntry.Combined
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.HeatMeters12
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,7 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
using Config;
@@ -12,8 +12,6 @@ namespace TBF.BenchControl.DataEntry.HeatMeters12
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.HeatMeters6
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,7 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
using Config;
@@ -12,8 +12,6 @@ namespace TBF.BenchControl.DataEntry.HeatMeters6
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.Munich
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,15 +3,13 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.DataEntry.Munich
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.Munich3
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,15 +3,13 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.DataEntry.Munich3
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.Standard12
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,7 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
@@ -11,8 +11,6 @@ namespace TBF.BenchControl.DataEntry.Standard12
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -216,6 +216,8 @@ namespace TBF.BenchControl.DataEntry.Standard12
private void okButton_Click(object sender, EventArgs eArgs)
{
log.Debug("okButton_Click(..)");
try
{
if (endStates)
@@ -240,7 +242,7 @@ namespace TBF.BenchControl.DataEntry.Standard12
}
}
}
catch(Exception e)
catch (Exception e)
{
log.ErrorFormat("Exception: {0}", e.Message);
return;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.Standard24
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }
@@ -3,7 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
@@ -11,8 +11,6 @@ namespace TBF.BenchControl.DataEntry.Standard24
{
public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(EntryFormCfgCtrl));
public bool ShowMore { get { return false; } }
EntryFormCfg config;
@@ -12,7 +12,7 @@ namespace TBF.BenchControl.DataEntry.Standard48
public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0];
protected override XmlSerializer GetSerializer() { return Serializer; }
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); }

Some files were not shown because too many files have changed in this diff Show More