fix precision correct factor (Mexico), added diff, correction in percentage in Result Configuration

This commit is contained in:
Michal Buzik 2026-09-07 14:07:07 +02:00
parent d3c8813012
commit 88b8bc5534
23 changed files with 265 additions and 0 deletions

View File

@ -63,6 +63,19 @@ namespace Results.Entities
#if IPERL #if IPERL
public virtual double OrigCalibFactor { get; set; } /// Original iPerl calibration factor used during the test public virtual double OrigCalibFactor { get; set; } /// Original iPerl calibration factor used during the test
public virtual double CalibFactor { get; set; } /// iPerl calibration factor used during the test public virtual double CalibFactor { get; set; } /// iPerl calibration factor used during the test
public virtual double CalibFactorNominal { get; set; } /// Raw calibration factor representing 100 % for this test result
public virtual double CalibFactorPercentage
{
get
{
double nominalCalibFactor = CalibFactorNominal > 0.0 ? CalibFactorNominal : 4096.0;
return CalibFactor * 100.0 / nominalCalibFactor;
}
}
public virtual double CalibFactorCorrectionPercentage
{
get { return CalibFactorPercentage - 100.0; }
}
public virtual double OrigCalibFactorLNA{ get; set; } /// Original iPerl LNA calibration factor used during the test public virtual double OrigCalibFactorLNA{ get; set; } /// Original iPerl LNA calibration factor used during the test
public virtual double CalibFactorLNA { get; set; } /// iPerl LNA calibration factor used during the test public virtual double CalibFactorLNA { get; set; } /// iPerl LNA calibration factor used during the test
public virtual double Q2ErrWOCorrection { get; set; } public virtual double Q2ErrWOCorrection { get; set; }
@ -519,6 +532,7 @@ namespace Results.Entities
#if IPERL #if IPERL
OrigCalibFactor = src.OrigCalibFactor; OrigCalibFactor = src.OrigCalibFactor;
CalibFactor = src.CalibFactor; CalibFactor = src.CalibFactor;
CalibFactorNominal = src.CalibFactorNominal;
OrigCalibFactorLNA = src.OrigCalibFactorLNA; OrigCalibFactorLNA = src.OrigCalibFactorLNA;
CalibFactorLNA = src.CalibFactorLNA; CalibFactorLNA = src.CalibFactorLNA;
Q2ErrWOCorrection = src.Q2ErrWOCorrection; Q2ErrWOCorrection = src.Q2ErrWOCorrection;

View File

@ -43,6 +43,42 @@ namespace Results.Entities.helpers
EnsureColumnMySql(conn, "TestRslt", "ConductMax", "FLOAT NOT NULL DEFAULT 0"); EnsureColumnMySql(conn, "TestRslt", "ConductMax", "FLOAT NOT NULL DEFAULT 0");
EnsureColumnMySql(conn, "MeterTestRslt", "FlipMode", "INT NULL"); EnsureColumnMySql(conn, "MeterTestRslt", "FlipMode", "INT NULL");
EnsureColumnMySql(conn, "WaterMeter", "CalibFactorNominal", "DOUBLE NOT NULL DEFAULT 4096");
// Nepouzitelne pre teraz - nechavam kod pre buducnost
//EnsureColumnMySql(conn, "MeterTestRslt", "CalibFactor", "FLOAT NOT NULL DEFAULT 0");
//EnsureColumnTypeMySql(conn, "MeterTestRslt", "CalibFactor", "float", "FLOAT NOT NULL DEFAULT 0");
}
}
private static void EnsureColumnTypeMySql(
MySqlConnection conn,
string tableName,
string columnName,
string expectedDataType,
string columnDefinition)
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = @"
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = @tableName
AND COLUMN_NAME = @columnName";
cmd.Parameters.AddWithValue("@tableName", tableName);
cmd.Parameters.AddWithValue("@columnName", columnName);
string currentDataType = cmd.ExecuteScalar() as string;
if (string.Equals(currentDataType, expectedDataType, StringComparison.OrdinalIgnoreCase))
return;
}
using (var alter = conn.CreateCommand())
{
alter.CommandText = "ALTER TABLE `" + tableName + "` MODIFY COLUMN `" +
columnName + "` " + columnDefinition;
alter.ExecuteNonQuery();
} }
} }
@ -107,6 +143,7 @@ namespace Results.Entities.helpers
// EnsureColumnSQLite(conn, "MeterTestRslt", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); // EnsureColumnSQLite(conn, "MeterTestRslt", "Q3Channel", "INTEGER NOT NULL DEFAULT 0");
EnsureColumnSQLite(conn, "MeterTestRslt", "FlipMode", "INTEGER NULL"); EnsureColumnSQLite(conn, "MeterTestRslt", "FlipMode", "INTEGER NULL");
EnsureColumnSQLite(conn, "WaterMeter", "CalibFactorNominal", "REAL NOT NULL DEFAULT 4096");
} }
} }

View File

@ -362,6 +362,8 @@ namespace Results
Pulses_per_unit, /// 306 Pulses_per_unit, /// 306
FlipMode, /// 307 iPerl mode used for this meter test result FlipMode, /// 307 iPerl mode used for this meter test result
CalibFactorPercentage, /// 308 iPerl calibration factor represented as a percentage
CalibFactorCorrectionPercentage,/// 309 iPerl calibration correction represented as a percentage
Count, Count,
} }
} }

View File

@ -32,6 +32,7 @@ namespace Results.Mappings
#if IPERL #if IPERL
Map(x => x.OrigCalibFactor); Map(x => x.OrigCalibFactor);
Map(x => x.CalibFactor); Map(x => x.CalibFactor);
Map(x => x.CalibFactorNominal);
Map(x => x.OrigCalibFactorLNA); Map(x => x.OrigCalibFactorLNA);
Map(x => x.CalibFactorLNA); Map(x => x.CalibFactorLNA);
Map(x => x.Q2ErrWOCorrection); Map(x => x.Q2ErrWOCorrection);

View File

@ -457,6 +457,8 @@ namespace Results
#if IPERL #if IPERL
AllItems.Add(new WMeterRsltItemSpec(ItemID.OrigCalibFactor, "iPerl OrigCalibFactor", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.OrigCalibFactor))); AllItems.Add(new WMeterRsltItemSpec(ItemID.OrigCalibFactor, "iPerl OrigCalibFactor", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.OrigCalibFactor)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactor, "iPerl CalibFactor", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.CalibFactor))); AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactor, "iPerl CalibFactor", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.CalibFactor)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactorPercentage, "iPerl CalibFactor (%)", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "F4", w.CalibFactorPercentage)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactorCorrectionPercentage, "iPerl Calibration correction (%)", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "F4", w.CalibFactorCorrectionPercentage)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.OrigCalibFactorLNA,"iPerl OrigCalibFactorLNA",Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.OrigCalibFactorLNA))); AllItems.Add(new WMeterRsltItemSpec(ItemID.OrigCalibFactorLNA,"iPerl OrigCalibFactorLNA",Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.OrigCalibFactorLNA)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactorLNA, "iPerl CalibFactorLNA", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.CalibFactorLNA))); AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactorLNA, "iPerl CalibFactorLNA", Quantity.Number, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.CalibFactorLNA)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2ErrWOCorrection, "iPerl Q2ErrWOCorrection", Quantity.Error, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.Q2ErrWOCorrection))); AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2ErrWOCorrection, "iPerl Q2ErrWOCorrection", Quantity.Error, ItemCategory.MeterResult, (w,t,u,f,p) => FormatDbl(u, f, p, "V3", w.Q2ErrWOCorrection)));

View File

@ -1770,4 +1770,10 @@
<data name="Loading" xml:space="preserve"><value>Načítání</value></data> <data name="Loading" xml:space="preserve"><value>Načítání</value></data>
<data name="Simulated" xml:space="preserve"><value>Simulace</value></data> <data name="Simulated" xml:space="preserve"><value>Simulace</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Nenačteno</value></data> <data name="Not_loaded" xml:space="preserve"><value>Nenačteno</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Výchozí kalibrační faktor:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Nominální surový kalibrační faktor odpovídající 100 %. Tato hodnota se používá pro výpočet položky „iPerl CalibFactor (%)“ v konfiguraci výsledků.</value>
</data>
</root> </root>

View File

@ -2232,4 +2232,10 @@
<data name="Loading" xml:space="preserve"><value>Laden</value></data> <data name="Loading" xml:space="preserve"><value>Laden</value></data>
<data name="Simulated" xml:space="preserve"><value>Simuliert</value></data> <data name="Simulated" xml:space="preserve"><value>Simuliert</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Nicht geladen</value></data> <data name="Not_loaded" xml:space="preserve"><value>Nicht geladen</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Standard-Kalibrierfaktor:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Roher Kalibrierfaktor, der 100 % entspricht. Dieser Wert wird zur Berechnung von „iPerl CalibFactor (%)“ in der Ergebnis-Konfiguration verwendet.</value>
</data>
</root> </root>

View File

@ -141,4 +141,10 @@
<data name="Loading" xml:space="preserve"><value>Cargando</value></data> <data name="Loading" xml:space="preserve"><value>Cargando</value></data>
<data name="Simulated" xml:space="preserve"><value>Simulado</value></data> <data name="Simulated" xml:space="preserve"><value>Simulado</value></data>
<data name="Not_loaded" xml:space="preserve"><value>No cargado</value></data> <data name="Not_loaded" xml:space="preserve"><value>No cargado</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Factor de calibración predeterminado:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Factor de calibración bruto que representa el 100 %. Este valor se utiliza para calcular «iPerl CalibFactor (%)» en la configuración de resultados.</value>
</data>
</root> </root>

View File

@ -2031,4 +2031,10 @@
<data name="Loading" xml:space="preserve"><value>Chargement</value></data> <data name="Loading" xml:space="preserve"><value>Chargement</value></data>
<data name="Simulated" xml:space="preserve"><value>Simulé</value></data> <data name="Simulated" xml:space="preserve"><value>Simulé</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Non chargé</value></data> <data name="Not_loaded" xml:space="preserve"><value>Non chargé</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Facteur détalonnage par défaut :</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Facteur détalonnage brut représentant 100 %. Cette valeur est utilisée pour calculer « iPerl CalibFactor (%) » dans la configuration des résultats.</value>
</data>
</root> </root>

View File

@ -1803,4 +1803,10 @@
<data name="Loading" xml:space="preserve"><value>Caricamento</value></data> <data name="Loading" xml:space="preserve"><value>Caricamento</value></data>
<data name="Simulated" xml:space="preserve"><value>Simulato</value></data> <data name="Simulated" xml:space="preserve"><value>Simulato</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Non caricato</value></data> <data name="Not_loaded" xml:space="preserve"><value>Non caricato</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Fattore di calibrazione predefinito:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Fattore di calibrazione grezzo corrispondente al 100 %. Questo valore viene usato per calcolare «iPerl CalibFactor (%)» nella configurazione dei risultati.</value>
</data>
</root> </root>

View File

@ -1707,4 +1707,10 @@
<data name="Loading" xml:space="preserve"><value>Ładowanie</value></data> <data name="Loading" xml:space="preserve"><value>Ładowanie</value></data>
<data name="Simulated" xml:space="preserve"><value>Symulacja</value></data> <data name="Simulated" xml:space="preserve"><value>Symulacja</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Nie wczytano</value></data> <data name="Not_loaded" xml:space="preserve"><value>Nie wczytano</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Domyślny współczynnik kalibracji:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Surowy współczynnik kalibracji odpowiadający 100 %. Ta wartość służy do obliczania „iPerl CalibFactor (%)” w konfiguracji wyników.</value>
</data>
</root> </root>

View File

@ -2503,4 +2503,10 @@
<data name="Not_loaded" xml:space="preserve"> <data name="Not_loaded" xml:space="preserve">
<value>Not loaded</value> <value>Not loaded</value>
</data> </data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Default calibration factor:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Raw calibration factor representing 100 %. This value is used to calculate 'iPerl CalibFactor (%)' in the results configuration.</value>
</data>
</root> </root>

View File

@ -855,4 +855,10 @@
<data name="Loading" xml:space="preserve"><value>Se încarcă</value></data> <data name="Loading" xml:space="preserve"><value>Se încarcă</value></data>
<data name="Simulated" xml:space="preserve"><value>Simulat</value></data> <data name="Simulated" xml:space="preserve"><value>Simulat</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Neîncărcat</value></data> <data name="Not_loaded" xml:space="preserve"><value>Neîncărcat</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Factor de calibrare implicit:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Factorul brut de calibrare care reprezintă 100 %. Această valoare este utilizată pentru calculul „iPerl CalibFactor (%)” în configurarea rezultatelor.</value>
</data>
</root> </root>

View File

@ -1620,4 +1620,10 @@
<data name="Loading" xml:space="preserve"><value>Загрузка</value></data> <data name="Loading" xml:space="preserve"><value>Загрузка</value></data>
<data name="Simulated" xml:space="preserve"><value>Симуляция</value></data> <data name="Simulated" xml:space="preserve"><value>Симуляция</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Не загружено</value></data> <data name="Not_loaded" xml:space="preserve"><value>Не загружено</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Номинальный коэффициент калибровки:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Необработанный коэффициент калибровки, соответствующий 100 %. Это значение используется для вычисления «iPerl CalibFactor (%)» в конфигурации результатов.</value>
</data>
</root> </root>

View File

@ -268,4 +268,10 @@
<data name="Loading" xml:space="preserve"><value>Načítavanie</value></data> <data name="Loading" xml:space="preserve"><value>Načítavanie</value></data>
<data name="Simulated" xml:space="preserve"><value>Simulácia</value></data> <data name="Simulated" xml:space="preserve"><value>Simulácia</value></data>
<data name="Not_loaded" xml:space="preserve"><value>Nenačítané</value></data> <data name="Not_loaded" xml:space="preserve"><value>Nenačítané</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>Predvolený kalibračný faktor:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>Nominálny surový kalibračný faktor zodpovedajúci 100 %. Táto hodnota sa používa na výpočet položky „iPerl CalibFactor (%)“ v konfigurácii výsledkov.</value>
</data>
</root> </root>

View File

@ -1209,4 +1209,10 @@
<data name="Loading" xml:space="preserve"><value>正在加载</value></data> <data name="Loading" xml:space="preserve"><value>正在加载</value></data>
<data name="Simulated" xml:space="preserve"><value>模拟</value></data> <data name="Simulated" xml:space="preserve"><value>模拟</value></data>
<data name="Not_loaded" xml:space="preserve"><value>未加载</value></data> <data name="Not_loaded" xml:space="preserve"><value>未加载</value></data>
<data name="IperlCalibFactorNominal" xml:space="preserve">
<value>默认校准系数:</value>
</data>
<data name="IperlCalibFactorNominalTooltip" xml:space="preserve">
<value>表示 100% 的原始校准系数。该值用于在结果配置中计算“iPerl CalibFactor (%)”。</value>
</data>
</root> </root>

View File

@ -1179,6 +1179,7 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
} }
#if IPERL #if IPERL
meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor; meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor;
meterRslt.WaterMeter.CalibFactorNominal = iPerl.CalibFactorNominal;
meterRslt.FlipMode = iPerl.ConfigStruct != null && iPerl.ConfigStruct.FlipMode.HasValue meterRslt.FlipMode = iPerl.ConfigStruct != null && iPerl.ConfigStruct.FlipMode.HasValue
? (int?)iPerl.ConfigStruct.FlipMode.Value ? (int?)iPerl.ConfigStruct.FlipMode.Value
: null; : null;

View File

@ -48,6 +48,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public const int EndOptoDataCount = OptoDataBufferSize - StartOptoDataCount; public const int EndOptoDataCount = OptoDataBufferSize - StartOptoDataCount;
public const int StartEndFilterSamplesCount2 = 1; //20 /// StartEndFilterSamplesCount = 2 * StartEndFilterSamplesCount2 + 1 public const int StartEndFilterSamplesCount2 = 1; //20 /// StartEndFilterSamplesCount = 2 * StartEndFilterSamplesCount2 + 1
public const int FeatureVectorSize = 9; public const int FeatureVectorSize = 9;
/// <summary>Default raw ViewCalibration value which represents 100 % according to the iPerl ASIC protocol.</summary>
public const double DefaultCalibFactorNominal = 4096.0;
private const int StartSampleDelaySec = 5; private const int StartSampleDelaySec = 5;
private const int EndSampleDelayCount = 2; private const int EndSampleDelayCount = 2;
@ -94,6 +96,15 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public string QuantityUnits { get; set; } public string QuantityUnits { get; set; }
public double CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } } public double CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } }
public double CalibFactorNominal
{
get
{
return iperlHeadCfg != null && iperlHeadCfg.CalibFactorNominal > 0.0
? iperlHeadCfg.CalibFactorNominal
: DefaultCalibFactorNominal;
}
}
public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } } public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } }
public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } } public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } }
public Counting InitFlowDir { get { return (iperlHeadCfg != null && iperlHeadCfg.ProcParams != null) ? iperlHeadCfg.ProcParams.Counting : Counting.Arbitrary; } } public Counting InitFlowDir { get { return (iperlHeadCfg != null && iperlHeadCfg.ProcParams != null) ? iperlHeadCfg.ProcParams.Counting : Counting.Arbitrary; } }
@ -157,6 +168,27 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
} }
} }
/// <summary>Converts the raw two-byte ViewCalibration factor to its percentage representation.</summary>
public static double CalculateCalibFactorPercentage(ushort rawCalibFactor)
{
return CalculateCalibFactorPercentage(rawCalibFactor, DefaultCalibFactorNominal);
}
public static double CalculateCalibFactorPercentage(ushort rawCalibFactor, double nominalCalibFactor)
{
return nominalCalibFactor > 0.0 ? rawCalibFactor * 100.0 / nominalCalibFactor : 0.0;
}
public double CalibFactorPercentage
{
get { return CalculateCalibFactorPercentage(CalibFactor, CalibFactorNominal); }
}
public double CalibFactorCorrectionPercentage
{
get { return CalibFactorPercentage - 100.0; }
}
public ushort OrigCalibFactorLNA; public ushort OrigCalibFactorLNA;
public ushort CalibFactorLNA { get { return (CalibrationStructV4 != null) ? CalibrationStructV4.CalibrationLNA : (ushort)0; } } public ushort CalibFactorLNA { get { return (CalibrationStructV4 != null) ? CalibrationStructV4.CalibrationLNA : (ushort)0; } }

View File

@ -27,6 +27,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4 public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4
public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10
public CommunicationInterface CommunicationInterface; /// Communication Interface: RFID or NFC public CommunicationInterface CommunicationInterface; /// Communication Interface: RFID or NFC
public double CalibFactorNominal; /// Raw calibration factor representing 100 % in the results calculation
/// <summary> Procedure parameters </summary> /// <summary> Procedure parameters </summary>
[XmlIgnore] [XmlIgnore]
@ -49,6 +50,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
ProcParams = CreateProcParamsProvider() as ProcParams; ProcParams = CreateProcParamsProvider() as ProcParams;
CommunicationInterface = CommunicationInterface.RFID; CommunicationInterface = CommunicationInterface.RFID;
HeadCommunicationComPortNr = 0; HeadCommunicationComPortNr = 0;
CalibFactorNominal = IperlHead.DefaultCalibFactorNominal;
} }
public IperlHeadCfg(IComponentFactory factory) public IperlHeadCfg(IComponentFactory factory)

View File

@ -2,6 +2,7 @@
/// Copyright (c) 2015-2017 Sensus Metering Systems /// Copyright (c) 2015-2017 Sensus Metering Systems
/// ///
using System; using System;
using System.Globalization;
using System.Net; using System.Net;
using System.Windows.Forms; using System.Windows.Forms;
using Common; using Common;
@ -33,6 +34,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) private void WaterMeterCfgCtrl_Load(object sender, EventArgs e)
{ {
nameLabel.Text = Strings.Name; nameLabel.Text = Strings.Name;
calibFactorNominalLabel.Text = GetLocalizedString("IperlCalibFactorNominal", "Default calibration factor:");
string calibFactorNominalTooltip = GetLocalizedString("IperlCalibFactorNominalTooltip", "Raw calibration factor representing 100 %. This value is used to calculate 'iPerl CalibFactor (%)' in the results configuration.");
calibFactorNominalToolTip.SetToolTip(calibFactorNominalLabel, calibFactorNominalTooltip);
calibFactorNominalToolTip.SetToolTip(calibFactorNominalTextBox, calibFactorNominalTooltip);
classNameLabel.Text = config.Factory.ClassName; classNameLabel.Text = config.Factory.ClassName;
Redraw(); Redraw();
} }
@ -55,6 +60,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
muxBoardNrTextBox.Text = config.MuxBoardNr.ToString(); muxBoardNrTextBox.Text = config.MuxBoardNr.ToString();
groupTextBox.Text = config.Group.ToString(); groupTextBox.Text = config.Group.ToString();
comboBoxCommunicationInterface.SelectedItem = config.CommunicationInterface.ToString(); comboBoxCommunicationInterface.SelectedItem = config.CommunicationInterface.ToString();
double nominalCalibFactor = config.CalibFactorNominal > 0.0
? config.CalibFactorNominal
: IperlHead.DefaultCalibFactorNominal;
calibFactorNominalTextBox.Text = nominalCalibFactor.ToString(CultureInfo.CurrentCulture);
tabPage2.Controls.Add(new IperlHeadTestCtrl(config)); tabPage2.Controls.Add(new IperlHeadTestCtrl(config));
} }
@ -71,6 +80,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
muxBoardNrTextBox.Enabled = true; muxBoardNrTextBox.Enabled = true;
groupTextBox.Enabled = true; groupTextBox.Enabled = true;
comboBoxCommunicationInterface.Enabled = true; comboBoxCommunicationInterface.Enabled = true;
calibFactorNominalTextBox.Enabled = true;
} }
public CfgUpdateFlags VerifyCfg(ref string message) public CfgUpdateFlags VerifyCfg(ref string message)
@ -127,6 +137,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
message += Environment.NewLine + string.Format(Strings.Invalid_0, groupLabel.Text); message += Environment.NewLine + string.Format(Strings.Invalid_0, groupLabel.Text);
} }
double nominalCalibFactor;
if (!TryParseDouble(calibFactorNominalTextBox.Text, out nominalCalibFactor) || nominalCalibFactor <= 0.0)
{
flags |= CfgUpdateFlags.Error;
message += Environment.NewLine + string.Format(Strings.Invalid_0, calibFactorNominalLabel.Text);
}
return flags; return flags;
} }
@ -155,8 +172,22 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
config.Group = int.Parse(groupTextBox.Text); config.Group = int.Parse(groupTextBox.Text);
config.CommunicationInterface = (CommunicationInterface)comboBoxCommunicationInterface.SelectedIndex; config.CommunicationInterface = (CommunicationInterface)comboBoxCommunicationInterface.SelectedIndex;
config.HeadCommunicationComPortNr = int.Parse(headPortNrTextBox.Text); config.HeadCommunicationComPortNr = int.Parse(headPortNrTextBox.Text);
double nominalCalibFactor;
if (TryParseDouble(calibFactorNominalTextBox.Text, out nominalCalibFactor))
config.CalibFactorNominal = nominalCalibFactor;
return flags; return flags;
} }
private static bool TryParseDouble(string value, out double result)
{
return double.TryParse(value, NumberStyles.Float, CultureInfo.CurrentCulture, out result) ||
double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out result);
}
private static string GetLocalizedString(string resourceName, string fallback)
{
return Strings.ResourceManager.GetString(resourceName, Strings.Culture) ?? fallback;
}
} }
} }

View File

@ -31,6 +31,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container();
this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabPage1 = new System.Windows.Forms.TabPage();
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
@ -60,6 +61,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
this.groupBox2 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.headPortNrTextBox = new System.Windows.Forms.TextBox(); this.headPortNrTextBox = new System.Windows.Forms.TextBox();
this.calibFactorNominalLabel = new System.Windows.Forms.Label();
this.calibFactorNominalTextBox = new System.Windows.Forms.TextBox();
this.calibFactorNominalToolTip = new System.Windows.Forms.ToolTip(this.components);
this.tabControl1.SuspendLayout(); this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout(); this.tabPage1.SuspendLayout();
this.groupBox1.SuspendLayout(); this.groupBox1.SuspendLayout();
@ -80,6 +84,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
// tabPage1 // tabPage1
// //
this.tabPage1.Controls.Add(this.groupBox2); this.tabPage1.Controls.Add(this.groupBox2);
this.tabPage1.Controls.Add(this.calibFactorNominalTextBox);
this.tabPage1.Controls.Add(this.calibFactorNominalLabel);
this.tabPage1.Controls.Add(this.label4); this.tabPage1.Controls.Add(this.label4);
this.tabPage1.Controls.Add(this.label3); this.tabPage1.Controls.Add(this.label3);
this.tabPage1.Controls.Add(this.groupBox1); this.tabPage1.Controls.Add(this.groupBox1);
@ -365,6 +371,23 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
this.groupBox2.TabStop = false; this.groupBox2.TabStop = false;
this.groupBox2.Text = "Head Communication"; this.groupBox2.Text = "Head Communication";
// //
// calibFactorNominalLabel
//
this.calibFactorNominalLabel.AutoSize = true;
this.calibFactorNominalLabel.Location = new System.Drawing.Point(290, 76);
this.calibFactorNominalLabel.Name = "calibFactorNominalLabel";
this.calibFactorNominalLabel.Size = new System.Drawing.Size(142, 16);
this.calibFactorNominalLabel.TabIndex = 27;
this.calibFactorNominalLabel.Text = "Default calibration factor:";
//
// calibFactorNominalTextBox
//
this.calibFactorNominalTextBox.Enabled = false;
this.calibFactorNominalTextBox.Location = new System.Drawing.Point(290, 96);
this.calibFactorNominalTextBox.Name = "calibFactorNominalTextBox";
this.calibFactorNominalTextBox.Size = new System.Drawing.Size(92, 22);
this.calibFactorNominalTextBox.TabIndex = 28;
//
// label2 // label2
// //
this.label2.AutoSize = true; this.label2.AutoSize = true;
@ -437,5 +460,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.TextBox headPortNrTextBox; private System.Windows.Forms.TextBox headPortNrTextBox;
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label calibFactorNominalLabel;
private System.Windows.Forms.TextBox calibFactorNominalTextBox;
private System.Windows.Forms.ToolTip calibFactorNominalToolTip;
} }
} }

View File

@ -0,0 +1,50 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Results.Entities;
using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
namespace TBFTests.Rig.TestMethods.iPerlCommunication.iPerlHead
{
[TestClass]
public class IperlHeadCalibrationTest
{
[TestMethod]
public void CalculateCalibFactorPercentage_UsesProtocolNominalFactor()
{
Assert.AreEqual(100.0,
IperlHead.CalculateCalibFactorPercentage(4096), 0.000000001);
Assert.AreEqual(93.310546875,
IperlHead.CalculateCalibFactorPercentage(3822), 0.000000001);
}
[TestMethod]
public void CalculateCalibFactorPercentage_UsesConfiguredNominalFactor()
{
Assert.AreEqual(76.44,
IperlHead.CalculateCalibFactorPercentage(3822, 5000.0), 0.000000001);
}
[TestMethod]
public void WaterMeterCalibFactorPercentage_UsesSavedNominalFactor()
{
var waterMeter = new WaterMeter
{
CalibFactor = 3822,
CalibFactorNominal = 5000.0
};
Assert.AreEqual(76.44, waterMeter.CalibFactorPercentage, 0.000000001);
}
[TestMethod]
public void WaterMeterCalibFactorCorrectionPercentage_IsPercentageMinusOneHundred()
{
var waterMeter = new WaterMeter
{
CalibFactor = 3822,
CalibFactorNominal = 4096.0
};
Assert.AreEqual(-6.689453125, waterMeter.CalibFactorCorrectionPercentage, 0.000000001);
}
}
}

View File

@ -155,6 +155,7 @@
<Compile Include="Rig\RegisterReaders\AllyReader\integration\AllyHardwareIntegrationTest.cs" /> <Compile Include="Rig\RegisterReaders\AllyReader\integration\AllyHardwareIntegrationTest.cs" />
<Compile Include="Rig\TestMethods\AllyCalibration\TestMethodConfigTest.cs" /> <Compile Include="Rig\TestMethods\AllyCalibration\TestMethodConfigTest.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\common\OptoTelegramRawTest.cs" /> <Compile Include="Rig\TestMethods\iPerlCommunication\common\OptoTelegramRawTest.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\IperlHeadCalibrationTest.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\communication\FakeSerialDriver.cs" /> <Compile Include="Rig\TestMethods\iPerlCommunication\communication\FakeSerialDriver.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\communication\IperlResponseFactory.cs" /> <Compile Include="Rig\TestMethods\iPerlCommunication\communication\IperlResponseFactory.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\communication\RadioServiceTest.cs" /> <Compile Include="Rig\TestMethods\iPerlCommunication\communication\RadioServiceTest.cs" />