Merge branch 'develop/SLM-PT50-7-2026-merged-smart-cam-slm-mex' into develop/SLM-PT50_genesisDirectDecode
This commit is contained in:
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("3.9.3134.0")]
|
||||
[assembly: AssemblyFileVersion("3.9.3134.0")]
|
||||
[assembly: AssemblyVersion("3.9.3134.112")]
|
||||
[assembly: AssemblyFileVersion("3.9.3134.112")]
|
||||
|
||||
Generated
+3
-2
@@ -1,6 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
@@ -18,7 +19,7 @@ namespace TBF.Resources {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Strings {
|
||||
@@ -4452,7 +4453,7 @@ namespace TBF.Resources {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Pulses per liter.
|
||||
/// Looks up a localized string similar to Pulses per unit.
|
||||
/// </summary>
|
||||
internal static string PulsesPerLtr {
|
||||
get {
|
||||
|
||||
@@ -529,7 +529,7 @@
|
||||
<value>Rychlost změny [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Impulsy na litr</value>
|
||||
<value>Impulsy na jednotky</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>Komponent</value>
|
||||
@@ -1734,6 +1734,18 @@
|
||||
<data name="ShowDialog" xml:space="preserve">
|
||||
<value>Zobraz Okno</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Test_in_calculation" xml:space="preserve">
|
||||
<value>Probíhá výpočet</value>
|
||||
</data>
|
||||
<data name="Arrangement_of_test" xml:space="preserve">
|
||||
<value>Uspořádání testu</value>
|
||||
</data>
|
||||
@@ -1755,16 +1767,4 @@
|
||||
<data name="Reload" xml:space="preserve">
|
||||
<value>Znovu otevřít</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Test_in_calculation" xml:space="preserve">
|
||||
<value>Probíhá výpočet</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -532,7 +532,7 @@
|
||||
<value>Durchflussänderung [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Impulse pro Liter</value>
|
||||
<value>Impulse pro Einheit</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>Komponente</value>
|
||||
@@ -2187,6 +2187,15 @@
|
||||
<data name="ShowDialog" xml:space="preserve">
|
||||
<value>Dialog anzeigen</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Meter_types_tested" xml:space="preserve">
|
||||
<value>Wasserzähler geprüft</value>
|
||||
</data>
|
||||
@@ -2220,13 +2229,4 @@
|
||||
<data name="Opto_head_was_disabled_by_the_user" xml:space="preserve">
|
||||
<value>Abtastkopf wurde deaktiviert vom Benutzer!</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -117,6 +117,9 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>pulsos por unidad</value>
|
||||
</data>
|
||||
<data name="Activity" xml:space="preserve">
|
||||
<value>Activity in Spanish</value>
|
||||
</data>
|
||||
|
||||
@@ -529,7 +529,7 @@
|
||||
<value>Taux de changement [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Impulsions par litre</value>
|
||||
<value>impulsions par unité</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>Composant</value>
|
||||
@@ -2004,6 +2004,15 @@
|
||||
<data name="ShowDialog" xml:space="preserve">
|
||||
<value>Afficher la boîte de dialogue</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Meter_types_tested" xml:space="preserve">
|
||||
<value>Types compteurs testés</value>
|
||||
</data>
|
||||
@@ -2019,13 +2028,4 @@
|
||||
<data name="Test_time_s_chdr" xml:space="preserve">
|
||||
<value>Temps test [s]</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -529,7 +529,7 @@
|
||||
<value>tasso di cambio [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>impulsi per litro</value>
|
||||
<value>impulsi per unità</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>componente</value>
|
||||
@@ -1761,6 +1761,15 @@
|
||||
<data name="ShowDialog" xml:space="preserve">
|
||||
<value>Mostra dialogo</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Meter_types_tested" xml:space="preserve">
|
||||
<value>tipi di contatori testati</value>
|
||||
</data>
|
||||
@@ -1791,13 +1800,4 @@
|
||||
<data name="Drain" xml:space="preserve">
|
||||
<value>Drenare</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -520,7 +520,7 @@
|
||||
<value>Szybkość zmian [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Impulsy na litr</value>
|
||||
<value>impulsów na jednostkę</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>Element</value>
|
||||
@@ -1644,6 +1644,15 @@
|
||||
<data name="Voltage" xml:space="preserve">
|
||||
<value>Napięcie</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Arrangement_of_test" xml:space="preserve">
|
||||
<value>Układ testu</value>
|
||||
</data>
|
||||
@@ -1695,13 +1704,4 @@
|
||||
<data name="Again" xml:space="preserve">
|
||||
<value>Jeszcze raz</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -541,7 +541,7 @@
|
||||
<value>Rate of change [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Pulses per liter</value>
|
||||
<value>Pulses per unit</value>
|
||||
</data>
|
||||
<data name="DelaySendImage" xml:space="preserve">
|
||||
<value>Delay between pictures</value>
|
||||
|
||||
@@ -433,7 +433,7 @@
|
||||
<value>Variatie debit [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>impuls pe litru</value>
|
||||
<value>impulsuri pe unitate</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>Componenta</value>
|
||||
@@ -819,6 +819,15 @@
|
||||
<data name="SaveCommunication" xml:space="preserve">
|
||||
<value>Save Communication</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="cold" xml:space="preserve">
|
||||
<value>rece</value>
|
||||
</data>
|
||||
@@ -843,13 +852,4 @@
|
||||
<data name="WMSN" xml:space="preserve">
|
||||
<value>seria</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -520,7 +520,7 @@
|
||||
<value>Скорость изменения [%]</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Импульсов на литр</value>
|
||||
<value>импульсов на единицу</value>
|
||||
</data>
|
||||
<data name="Component" xml:space="preserve">
|
||||
<value>Компонент</value>
|
||||
@@ -1554,6 +1554,15 @@
|
||||
<data name="Voltage" xml:space="preserve">
|
||||
<value>Voltage</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="cold" xml:space="preserve">
|
||||
<value>холодный</value>
|
||||
</data>
|
||||
@@ -1608,13 +1617,4 @@
|
||||
<data name="Again" xml:space="preserve">
|
||||
<value>Снова</value>
|
||||
</data>
|
||||
<data name="PulsesPerUnit" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="PulsesPerKilogram" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="Units" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -135,6 +135,9 @@
|
||||
<data name="Compound_meters" xml:space="preserve">
|
||||
<value>Združené vodomery</value>
|
||||
</data>
|
||||
<data name="PulsesPerLtr" xml:space="preserve">
|
||||
<value>Pulzy na jednotky</value>
|
||||
</data>
|
||||
<data name="Activity" xml:space="preserve">
|
||||
<value>Činnosť</value>
|
||||
</data>
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
///
|
||||
using log4net;
|
||||
using SharedComponents;
|
||||
///
|
||||
/// Copyright (c) 2021 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using log4net;
|
||||
|
||||
namespace TBF.Rig.ControlBoard.Uni
|
||||
{
|
||||
@@ -204,6 +205,8 @@ namespace TBF.Rig.ControlBoard.Uni
|
||||
EtPulses2 = Convert.ToInt32(GetUInt24(data, offs + (int)Poz.ETX2)); /// Byte 294,295,296
|
||||
EtPulses3 = Convert.ToInt32(GetUInt24(data, offs + (int)Poz.ETX3)); /// Byte 297,298.299 !!!!!!!!!!!!!!!
|
||||
|
||||
//LiveLogCache.Instance.AddLog(string.Format("Et={0} State={1:X14} Route={2} Freq={3} EtPulses={4} TTime={5} WMPulses[3]={6} WMRefPulses[3]={7}, Time[3]={8}",
|
||||
// State & 7, State, Utils.ToBin40(Vystupy >> 8), ReferenceFreq[0], EtPulses[0], Ttime, WMeterPuls[3], EtPulses[3], ImpulseTime[3]));
|
||||
log.InfoFormat("Et={0} State={1:X14} Route={2} Freq={3} EtPulses={4} TTime={5} WMPulses[3]={6} WMRefPulses[3]={7}, Time[3]={8}",
|
||||
State & 7, State, Utils.ToBin40(Vystupy >> 8), ReferenceFreq[0], EtPulses[0], Ttime, WMeterPuls[3], EtPulses[3], ImpulseTime[3]);
|
||||
}
|
||||
|
||||
@@ -1389,12 +1389,14 @@ namespace TBF.Rig.DataEntry.Standard24
|
||||
// unitComboBox
|
||||
//
|
||||
this.unitComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.unitComboBox.Enabled = false;
|
||||
this.unitComboBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.unitComboBox.FormattingEnabled = true;
|
||||
this.unitComboBox.Location = new System.Drawing.Point(999, 131);
|
||||
this.unitComboBox.Name = "unitComboBox";
|
||||
this.unitComboBox.Size = new System.Drawing.Size(123, 31);
|
||||
this.unitComboBox.TabIndex = 103;
|
||||
this.unitComboBox.Visible = false;
|
||||
this.unitComboBox.SelectedIndexChanged += new System.EventHandler(this.unitComboBox_SelectedIndexChanged);
|
||||
this.unitComboBox.TextChanged += new System.EventHandler(this.unitComboBox_TextChanged);
|
||||
//
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace TBF.Rig.DataEntry.StandardCamera
|
||||
{
|
||||
private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm));
|
||||
|
||||
const Unit unit = Unit.m3;
|
||||
const Unit unit = Unit.l;
|
||||
|
||||
///
|
||||
/// Static members and constructor
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
|
||||
{
|
||||
private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm));
|
||||
|
||||
const Unit unit = Unit.m3;
|
||||
const Unit unit = Unit.l;
|
||||
|
||||
///
|
||||
/// Static members and constructor
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Diagnostic;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Diagnostic;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Interfaces;
|
||||
|
||||
namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter
|
||||
|
||||
public const string Csv = ".csv";
|
||||
public const string Xls = ".xls";
|
||||
public const string Xlsx = ".xlsx";
|
||||
public const string Json = ".json";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
using Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TBF.Rig.Generic;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Interfaces;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writers;
|
||||
using static TBF.Rig.Output.DataStorage.UniDataStorageWriter.Types;
|
||||
using Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TBF.Rig.Generic;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Interfaces;
|
||||
using TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writers;
|
||||
using static TBF.Rig.Output.DataStorage.UniDataStorageWriter.Types;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
{
|
||||
@@ -25,6 +26,32 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
|
||||
private WriterCfg config;
|
||||
|
||||
private bool isUnlocked;
|
||||
|
||||
private const string CsvTemplateHint =
|
||||
"Write template is not used.";
|
||||
|
||||
private const string DefaultDatabaseInsertTemplate =
|
||||
"Insert|INSERT INTO dbo.table ({0}) VALUES ({1})";
|
||||
|
||||
private const string DefaultDatabaseUpdateTemplate =
|
||||
"Update|UPDATE dbo.table SET {2} = {3} WHERE {0} = {1}";
|
||||
|
||||
private const string DefaultXlsxInsertTemplate =
|
||||
"Insert|INSERT INTO Sheet1 ({0}) VALUES ({1})";
|
||||
|
||||
private const string DefaultXlsxUpdateTemplate =
|
||||
"Update|UPDATE Sheet1 SET {2} = {3} WHERE {0} = {1}";
|
||||
|
||||
private const int EmSetCueBanner = 0x1501;
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
private static extern IntPtr SendMessage(
|
||||
IntPtr hWnd,
|
||||
int msg,
|
||||
IntPtr wParam,
|
||||
string lParam);
|
||||
|
||||
public bool ShowMore
|
||||
{
|
||||
get { return false; }
|
||||
@@ -55,6 +82,8 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
buttonUpdateTemplate.Click += buttonUpdateTemplate_Click;
|
||||
buttonRemoveTemplate.Click += buttonRemoveTemplate_Click;
|
||||
writeTemplatesListBox.SelectedIndexChanged += writeTemplatesListBox_SelectedIndexChanged;
|
||||
|
||||
technologyTypeComboBox.SelectedIndexChanged += technologyTypeComboBox_SelectedIndexChanged;
|
||||
}
|
||||
|
||||
private void WriterCfgCtrl_Load(object sender, EventArgs e)
|
||||
@@ -70,6 +99,8 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
|
||||
if (config != null)
|
||||
Redraw();
|
||||
|
||||
ApplyTechnologyConfiguration(true);
|
||||
}
|
||||
|
||||
public void Closing()
|
||||
@@ -118,29 +149,136 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
RefreshTemplatesListBox();
|
||||
UpdateInputHint();
|
||||
RefreshWriteParamsListBox();
|
||||
|
||||
ApplyTechnologyConfiguration(true);
|
||||
}
|
||||
|
||||
public void Unlock()
|
||||
{
|
||||
isUnlocked = true;
|
||||
|
||||
nameTextBox.Enabled = true;
|
||||
dataStorageTypeComboBox.Enabled = true;
|
||||
dataSourceTextBox.Enabled = true;
|
||||
|
||||
sourceTestResultTextBox.Enabled = true;
|
||||
sourceTestResultTextBox.ReadOnly = true;
|
||||
|
||||
writeTestResultTextBox.Enabled = true;
|
||||
writeTestResultTextBox.ReadOnly = true;
|
||||
|
||||
writeParamValueTextBox.Enabled = true;
|
||||
listBoxWriteParams.Enabled = true;
|
||||
buttonAddParam.Enabled = true;
|
||||
buttonRemoveParam.Enabled = true;
|
||||
writeModeComboBox.Enabled = true;
|
||||
technologyTypeComboBox.Enabled = true;
|
||||
writeTemplatesListBox.Enabled = true;
|
||||
templateEditTextBox.Enabled = true;
|
||||
buttonAddTemplate.Enabled = true;
|
||||
buttonUpdateTemplate.Enabled = true;
|
||||
buttonRemoveTemplate.Enabled = true;
|
||||
examples1Button.Enabled = true;
|
||||
|
||||
ApplyTechnologyConfiguration(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates source hints, default templates and template control availability
|
||||
/// according to the selected technology.
|
||||
/// </summary>
|
||||
/// <param name="initializeDefaults">
|
||||
/// <see langword="true"/> to create default templates when the template list
|
||||
/// is empty; otherwise, <see langword="false"/>.
|
||||
/// </param>
|
||||
private void ApplyTechnologyConfiguration(bool initializeDefaults)
|
||||
{
|
||||
string technologyType =
|
||||
(technologyTypeComboBox.Text ?? string.Empty).Trim();
|
||||
|
||||
SetDataSourceHint(GetDataSourceHint(technologyType));
|
||||
|
||||
bool templatesSupported =
|
||||
technologyType == TechnologyTypes.MicrosoftSql ||
|
||||
technologyType == TechnologyTypes.Xlsx ||
|
||||
technologyType == TechnologyTypes.Xls;
|
||||
|
||||
if (technologyType == TechnologyTypes.Csv)
|
||||
{
|
||||
writeTemplatesListBox.Items.Clear();
|
||||
|
||||
templateEditTextBox.Text = CsvTemplateHint;
|
||||
|
||||
SetTemplateControlsEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (initializeDefaults &&
|
||||
templatesSupported &&
|
||||
writeTemplatesListBox.Items.Count == 0)
|
||||
{
|
||||
AddDefaultTemplates(technologyType);
|
||||
}
|
||||
|
||||
if (!templatesSupported)
|
||||
{
|
||||
writeTemplatesListBox.Items.Clear();
|
||||
templateEditTextBox.Clear();
|
||||
}
|
||||
else if (templateEditTextBox.Text == CsvTemplateHint)
|
||||
{
|
||||
templateEditTextBox.Clear();
|
||||
}
|
||||
|
||||
SetTemplateControlsEnabled(
|
||||
templatesSupported && isUnlocked);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds default write templates for the selected technology.
|
||||
/// </summary>
|
||||
/// <param name="technologyType">
|
||||
/// Selected writer technology type.
|
||||
/// </param>
|
||||
private void AddDefaultTemplates(string technologyType)
|
||||
{
|
||||
writeTemplatesListBox.Items.Clear();
|
||||
|
||||
switch (technologyType)
|
||||
{
|
||||
case TechnologyTypes.MicrosoftSql:
|
||||
writeTemplatesListBox.Items.Add(
|
||||
DefaultDatabaseInsertTemplate);
|
||||
|
||||
writeTemplatesListBox.Items.Add(
|
||||
DefaultDatabaseUpdateTemplate);
|
||||
break;
|
||||
|
||||
case TechnologyTypes.Xlsx:
|
||||
case TechnologyTypes.Xls:
|
||||
writeTemplatesListBox.Items.Add(
|
||||
DefaultXlsxInsertTemplate);
|
||||
|
||||
writeTemplatesListBox.Items.Add(
|
||||
DefaultXlsxUpdateTemplate);
|
||||
break;
|
||||
}
|
||||
|
||||
if (writeTemplatesListBox.Items.Count > 0)
|
||||
writeTemplatesListBox.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Enables or disables controls used for write template configuration.
|
||||
/// </summary>
|
||||
/// <param name="enabled">
|
||||
/// <see langword="true"/> to enable template editing; otherwise,
|
||||
/// <see langword="false"/>.
|
||||
/// </param>
|
||||
private void SetTemplateControlsEnabled(bool enabled)
|
||||
{
|
||||
writeTemplatesListBox.Enabled = enabled;
|
||||
templateEditTextBox.Enabled = enabled;
|
||||
|
||||
buttonAddTemplate.Enabled = enabled;
|
||||
buttonUpdateTemplate.Enabled = enabled;
|
||||
buttonRemoveTemplate.Enabled = enabled;
|
||||
|
||||
examples1Button.Enabled = enabled;
|
||||
}
|
||||
|
||||
public CfgUpdateFlags VerifyCfg(ref string message)
|
||||
@@ -214,14 +352,9 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
tmpCfg.TechnologyType = (technologyTypeComboBox.Text ?? string.Empty).Trim();
|
||||
tmpCfg.DataSource = dataSourceTextBox.Text;
|
||||
|
||||
if (config != null && config.WriteTemplates != null)
|
||||
{
|
||||
tmpCfg.WriteTemplates = new List<string>(config.WriteTemplates);
|
||||
}
|
||||
else
|
||||
{
|
||||
tmpCfg.WriteTemplates = new List<string>();
|
||||
}
|
||||
tmpCfg.WriteTemplates = writeTemplatesListBox.Items
|
||||
.Cast<string>()
|
||||
.ToList();
|
||||
|
||||
string selectedTemplate = tmpCfg.GetTemplate(mode);
|
||||
tmpCfg.QueryTemplate = selectedTemplate;
|
||||
@@ -267,6 +400,9 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
case TechnologyTypes.Csv:
|
||||
return new CsvWriter(cfg);
|
||||
|
||||
case TechnologyTypes.Xlsx:
|
||||
return new XlsxWriter(cfg);
|
||||
|
||||
case TechnologyTypes.Json:
|
||||
throw new NotSupportedException("JSON writer is not supported yet.");
|
||||
|
||||
@@ -362,18 +498,39 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
return request;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses an insert parameter in the format <c>Column=Value</c>.
|
||||
/// </summary>
|
||||
/// <param name="text">
|
||||
/// Text containing the column name and value.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// Parsed insert write item.
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// Thrown when the input format is invalid.
|
||||
/// </exception>
|
||||
private InsertWriteItem ParseInsertItem(string text)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
throw new InvalidOperationException("Insert item is empty.");
|
||||
|
||||
string[] parts = text
|
||||
.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Split(new[] { '=' }, 2, StringSplitOptions.None)
|
||||
.Select(p => p.Trim())
|
||||
.ToArray();
|
||||
|
||||
if (parts.Length != 2)
|
||||
throw new InvalidOperationException("Insert format must be: Column;Value");
|
||||
throw new InvalidOperationException(
|
||||
"Insert format must be: Column=Value");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(parts[0]))
|
||||
throw new InvalidOperationException(
|
||||
"Insert column name cannot be empty.");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(parts[1]))
|
||||
throw new InvalidOperationException(
|
||||
"Insert value cannot be empty.");
|
||||
|
||||
return new InsertWriteItem
|
||||
{
|
||||
@@ -382,25 +539,75 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses an update parameter in the format
|
||||
/// <c>WhereName=WhereValue;SetName=SetValue</c>.
|
||||
/// </summary>
|
||||
/// <param name="text">
|
||||
/// Text containing the update condition and target value.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// Parsed update write item.
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// Thrown when the input format is invalid.
|
||||
/// </exception>
|
||||
private UpdateWriteItem ParseUpdateItem(string text)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
throw new InvalidOperationException("Update item is empty.");
|
||||
|
||||
string[] parts = text
|
||||
.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
|
||||
string[] pairs = text
|
||||
.Split(new[] { ';' }, StringSplitOptions.None)
|
||||
.Select(p => p.Trim())
|
||||
.ToArray();
|
||||
|
||||
if (parts.Length != 4)
|
||||
throw new InvalidOperationException("Update format must be: WhereName;WhereValue;SetName;SetValue");
|
||||
if (pairs.Length != 2)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Update format must be: " +
|
||||
"WhereName=WhereValue;SetName=SetValue");
|
||||
}
|
||||
|
||||
string[] whereParts = pairs[0]
|
||||
.Split(new[] { '=' }, 2, StringSplitOptions.None)
|
||||
.Select(p => p.Trim())
|
||||
.ToArray();
|
||||
|
||||
string[] setParts = pairs[1]
|
||||
.Split(new[] { '=' }, 2, StringSplitOptions.None)
|
||||
.Select(p => p.Trim())
|
||||
.ToArray();
|
||||
|
||||
if (whereParts.Length != 2 || setParts.Length != 2)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Update format must be: " +
|
||||
"WhereName=WhereValue;SetName=SetValue");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(whereParts[0]))
|
||||
throw new InvalidOperationException(
|
||||
"WHERE column name cannot be empty.");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(whereParts[1]))
|
||||
throw new InvalidOperationException(
|
||||
"WHERE value cannot be empty.");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(setParts[0]))
|
||||
throw new InvalidOperationException(
|
||||
"SET column name cannot be empty.");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(setParts[1]))
|
||||
throw new InvalidOperationException(
|
||||
"SET value cannot be empty.");
|
||||
|
||||
return new UpdateWriteItem
|
||||
{
|
||||
WhereParameterName = parts[0],
|
||||
WhereValue = parts[1],
|
||||
SetParameterName = parts[2],
|
||||
SetValue = parts[3]
|
||||
WhereParameterName = whereParts[0],
|
||||
WhereValue = whereParts[1],
|
||||
SetParameterName = setParts[0],
|
||||
SetValue = setParts[1]
|
||||
};
|
||||
}
|
||||
|
||||
@@ -413,18 +620,33 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
return;
|
||||
|
||||
WriteMode mode;
|
||||
if (!Enum.TryParse(writeModeComboBox.Text, true, out mode))
|
||||
mode = WriteMode.Insert;
|
||||
try
|
||||
{
|
||||
WriteMode mode;
|
||||
|
||||
if (mode == WriteMode.Insert)
|
||||
ParseInsertItem(text);
|
||||
else if (mode == WriteMode.Update)
|
||||
ParseUpdateItem(text);
|
||||
if (!Enum.TryParse(writeModeComboBox.Text, true, out mode))
|
||||
mode = WriteMode.Insert;
|
||||
|
||||
batchWriteLines.Add(text);
|
||||
writeParamValueTextBox.Clear();
|
||||
RefreshWriteParamsListBox();
|
||||
if (mode == WriteMode.Insert)
|
||||
ParseInsertItem(text);
|
||||
else if (mode == WriteMode.Update)
|
||||
ParseUpdateItem(text);
|
||||
|
||||
batchWriteLines.Add(text);
|
||||
|
||||
writeParamValueTextBox.Clear();
|
||||
RefreshWriteParamsListBox();
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
writeTestResultTextBox.Text =
|
||||
"Invalid write parameter:" +
|
||||
Environment.NewLine +
|
||||
ex.Message;
|
||||
|
||||
writeParamValueTextBox.Focus();
|
||||
writeParamValueTextBox.SelectAll();
|
||||
}
|
||||
}
|
||||
|
||||
private void buttonRemoveParam_Click(object sender, EventArgs e)
|
||||
@@ -452,13 +674,16 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
{
|
||||
if (writeModeComboBox.Text == WriteMode.Insert.ToString())
|
||||
{
|
||||
labelParamValue.Text = "Insert: Column;Value";
|
||||
writeParamValueTextBox.Text = "Column;Value";
|
||||
labelParamValue.Text = "Insert: Column=Value";
|
||||
writeParamValueTextBox.Text = "Column=Value";
|
||||
}
|
||||
else
|
||||
{
|
||||
labelParamValue.Text = "Update: WhereName;WhereValue;SetName;SetValue";
|
||||
writeParamValueTextBox.Text = "WhereName;WhereValue;SetName;SetValue";
|
||||
labelParamValue.Text =
|
||||
"Update: WhereName=WhereValue;SetName=SetValue";
|
||||
|
||||
writeParamValueTextBox.Text =
|
||||
"WhereName=WhereValue;SetName=SetValue";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -539,37 +764,64 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
|
||||
private void UpdateTechnologyTypeUi()
|
||||
{
|
||||
string storageType = (dataStorageTypeComboBox.Text ?? string.Empty).Trim();
|
||||
string previousTechnology =
|
||||
(technologyTypeComboBox.Text ?? string.Empty).Trim();
|
||||
|
||||
string storageType =
|
||||
(dataStorageTypeComboBox.Text ?? string.Empty).Trim();
|
||||
|
||||
technologyTypeComboBox.Items.Clear();
|
||||
technologyTypeComboBox.Text = string.Empty;
|
||||
|
||||
switch (storageType)
|
||||
{
|
||||
case StorageTypes.LocalDatabase:
|
||||
case StorageTypes.RemoteDatabase:
|
||||
technologyTypeLabel.Text = "Database type:";
|
||||
technologyTypeComboBox.Items.Add(TechnologyTypes.MicrosoftSql);
|
||||
technologyTypeComboBox.Items.Add(TechnologyTypes.MySqlMariaDb);
|
||||
technologyTypeComboBox.Items.Add(TechnologyTypes.SQLite);
|
||||
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.MicrosoftSql);
|
||||
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.MySqlMariaDb);
|
||||
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.SQLite);
|
||||
break;
|
||||
|
||||
case StorageTypes.LocalFile:
|
||||
case StorageTypes.RemoteFile:
|
||||
technologyTypeLabel.Text = "File type:";
|
||||
technologyTypeComboBox.Items.Add(TechnologyTypes.Csv);
|
||||
technologyTypeComboBox.Items.Add(TechnologyTypes.Xls);
|
||||
technologyTypeComboBox.Items.Add(TechnologyTypes.Json);
|
||||
break;
|
||||
|
||||
case StorageTypes.RestApi:
|
||||
technologyTypeLabel.Text = "Technology type:";
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.Csv);
|
||||
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.Xlsx);
|
||||
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.Xls);
|
||||
|
||||
technologyTypeComboBox.Items.Add(
|
||||
TechnologyTypes.Json);
|
||||
break;
|
||||
|
||||
default:
|
||||
technologyTypeLabel.Text = "Technology type:";
|
||||
break;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(previousTechnology) &&
|
||||
technologyTypeComboBox.Items.Contains(previousTechnology))
|
||||
{
|
||||
technologyTypeComboBox.SelectedItem =
|
||||
previousTechnology;
|
||||
}
|
||||
else if (technologyTypeComboBox.Items.Count > 0)
|
||||
{
|
||||
technologyTypeComboBox.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
ApplyTechnologyConfiguration(true);
|
||||
}
|
||||
|
||||
private void writeModeComboBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||
@@ -599,6 +851,11 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
templateEditTextBox.Text = writeTemplatesListBox.SelectedItem.ToString();
|
||||
}
|
||||
|
||||
private void technologyTypeComboBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
ApplyTechnologyConfiguration(true);
|
||||
}
|
||||
|
||||
private void buttonAddTemplate_Click(object sender, EventArgs e)
|
||||
{
|
||||
string text = (templateEditTextBox.Text ?? string.Empty).Trim();
|
||||
@@ -652,5 +909,55 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
writeTemplatesListBox.SelectedIndex = newIndex;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the data source hint for the selected technology.
|
||||
/// </summary>
|
||||
/// <param name="technologyType">
|
||||
/// Selected technology type.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// Data source input hint.
|
||||
/// </returns>
|
||||
private string GetDataSourceHint(string technologyType)
|
||||
{
|
||||
switch (technologyType)
|
||||
{
|
||||
case TechnologyTypes.Csv:
|
||||
return "Insert the .csv file path";
|
||||
|
||||
case TechnologyTypes.Xlsx:
|
||||
return "Insert the .xlsx file path";
|
||||
|
||||
case TechnologyTypes.Xls:
|
||||
return "Insert the .xls file path";
|
||||
|
||||
case TechnologyTypes.MicrosoftSql:
|
||||
case TechnologyTypes.MySqlMariaDb:
|
||||
case TechnologyTypes.SQLite:
|
||||
return "Insert database connection string";
|
||||
|
||||
default:
|
||||
return "Insert data storage source";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the placeholder text displayed by the data source textbox.
|
||||
/// </summary>
|
||||
/// <param name="hint">
|
||||
/// Placeholder text.
|
||||
/// </param>
|
||||
private void SetDataSourceHint(string hint)
|
||||
{
|
||||
if (!dataSourceTextBox.IsHandleCreated)
|
||||
return;
|
||||
|
||||
SendMessage(
|
||||
dataSourceTextBox.Handle,
|
||||
EmSetCueBanner,
|
||||
new IntPtr(1),
|
||||
hint ?? string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -202,7 +202,6 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.UI
|
||||
this.writeDataByParamAndTemplateButton.TabIndex = 17;
|
||||
this.writeDataByParamAndTemplateButton.Text = "Write data by param and template";
|
||||
this.writeDataByParamAndTemplateButton.UseVisualStyleBackColor = true;
|
||||
this.writeDataByParamAndTemplateButton.Click += new System.EventHandler(this.writeDataByParamAndTemplateButton_Click);
|
||||
//
|
||||
// groupBox3
|
||||
//
|
||||
|
||||
@@ -105,6 +105,12 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter
|
||||
case TechnologyTypes.Csv:
|
||||
return new CsvWriter(cfg);
|
||||
|
||||
case TechnologyTypes.Xlsx:
|
||||
return new XlsxWriter(cfg);
|
||||
|
||||
case TechnologyTypes.Xls:
|
||||
return new XlsxWriter(cfg);
|
||||
|
||||
case TechnologyTypes.Json:
|
||||
return new JsonWriter(cfg);
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -99,30 +100,160 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Insert mode:
|
||||
/// request.InsertItems define a single CSV row.
|
||||
/// Example:
|
||||
/// SerialNumber=SN001
|
||||
/// Result=PASS
|
||||
/// Produces:
|
||||
/// SN001;PASS
|
||||
///
|
||||
/// Current implementation writes only values, not header names.
|
||||
/// Appends one data row to the CSV file.
|
||||
/// </summary>
|
||||
/// <param name="request">
|
||||
/// Request containing the insert items.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// A diagnostic result describing the inserted row.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// When the CSV file is empty or contains only empty lines, the first row is
|
||||
/// automatically created from the insert item column names.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// When the CSV file already contains a header, values are ordered according
|
||||
/// to the existing header.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
private WriterDiagnosticResult ExecuteInsert(DataWriteRequest request)
|
||||
{
|
||||
if (request.InsertItems == null || request.InsertItems.Count == 0)
|
||||
if (request.InsertItems == null ||
|
||||
request.InsertItems.Count == 0)
|
||||
{
|
||||
return Fail("No insert items provided.");
|
||||
}
|
||||
|
||||
string delimiter = ";";
|
||||
if (request.InsertItems.Any(i => i == null))
|
||||
return Fail("Insert items contain a null item.");
|
||||
|
||||
string[] values = request.InsertItems
|
||||
.Select(i => EscapeCsvValue(i != null ? i.Value : null))
|
||||
if (request.InsertItems.Any(
|
||||
i => string.IsNullOrWhiteSpace(i.ColumnName)))
|
||||
{
|
||||
return Fail("Insert item contains an empty column name.");
|
||||
}
|
||||
|
||||
string[] duplicateColumns = request.InsertItems
|
||||
.GroupBy(
|
||||
i => i.ColumnName,
|
||||
StringComparer.OrdinalIgnoreCase)
|
||||
.Where(g => g.Count() > 1)
|
||||
.Select(g => g.Key)
|
||||
.ToArray();
|
||||
|
||||
if (duplicateColumns.Length > 0)
|
||||
{
|
||||
return Fail(
|
||||
"Insert items contain duplicate columns: " +
|
||||
string.Join(", ", duplicateColumns));
|
||||
}
|
||||
|
||||
const string delimiter = ";";
|
||||
|
||||
Dictionary<string, string> valuesByColumn =
|
||||
request.InsertItems.ToDictionary(
|
||||
item => item.ColumnName,
|
||||
item => item.Value,
|
||||
StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
string firstNonEmptyLine = null;
|
||||
|
||||
if (File.Exists(cfg.DataSource))
|
||||
{
|
||||
firstNonEmptyLine = File
|
||||
.ReadLines(cfg.DataSource, Encoding.UTF8)
|
||||
.FirstOrDefault(line => !string.IsNullOrWhiteSpace(line));
|
||||
}
|
||||
|
||||
string[] headerColumns;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(firstNonEmptyLine))
|
||||
{
|
||||
headerColumns = request.InsertItems
|
||||
.Select(item => item.ColumnName)
|
||||
.ToArray();
|
||||
|
||||
string headerLine = string.Join(
|
||||
delimiter,
|
||||
headerColumns.Select(EscapeCsvValue));
|
||||
|
||||
// The file is empty or contains only blank lines.
|
||||
// Rewrite it so that the header is always the first row.
|
||||
File.WriteAllText(
|
||||
cfg.DataSource,
|
||||
headerLine + Environment.NewLine,
|
||||
Encoding.UTF8);
|
||||
}
|
||||
else
|
||||
{
|
||||
headerColumns = ParseCsvLine(
|
||||
firstNonEmptyLine,
|
||||
delimiter[0])
|
||||
.Select(value => value.Trim())
|
||||
.ToArray();
|
||||
|
||||
if (headerColumns.Length == 0 ||
|
||||
headerColumns.All(string.IsNullOrWhiteSpace))
|
||||
{
|
||||
return Fail("CSV file does not contain a valid header.");
|
||||
}
|
||||
|
||||
if (headerColumns.Any(string.IsNullOrWhiteSpace))
|
||||
{
|
||||
return Fail(
|
||||
"CSV header contains an empty column name.");
|
||||
}
|
||||
|
||||
string[] duplicateHeaderColumns = headerColumns
|
||||
.GroupBy(
|
||||
name => name,
|
||||
StringComparer.OrdinalIgnoreCase)
|
||||
.Where(g => g.Count() > 1)
|
||||
.Select(g => g.Key)
|
||||
.ToArray();
|
||||
|
||||
if (duplicateHeaderColumns.Length > 0)
|
||||
{
|
||||
return Fail(
|
||||
"CSV header contains duplicate columns: " +
|
||||
string.Join(", ", duplicateHeaderColumns));
|
||||
}
|
||||
}
|
||||
|
||||
string[] missingColumns = request.InsertItems
|
||||
.Select(item => item.ColumnName)
|
||||
.Where(name => !headerColumns.Contains(
|
||||
name,
|
||||
StringComparer.OrdinalIgnoreCase))
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToArray();
|
||||
|
||||
if (missingColumns.Length > 0)
|
||||
{
|
||||
return Fail(
|
||||
"CSV header does not contain columns: " +
|
||||
string.Join(", ", missingColumns));
|
||||
}
|
||||
|
||||
string[] values = headerColumns
|
||||
.Select(columnName =>
|
||||
{
|
||||
string value;
|
||||
|
||||
return valuesByColumn.TryGetValue(columnName, out value)
|
||||
? EscapeCsvValue(value)
|
||||
: string.Empty;
|
||||
})
|
||||
.ToArray();
|
||||
|
||||
string line = string.Join(delimiter, values);
|
||||
|
||||
File.AppendAllText(cfg.DataSource, line + Environment.NewLine, Encoding.UTF8);
|
||||
File.AppendAllText(
|
||||
cfg.DataSource,
|
||||
line + Environment.NewLine,
|
||||
Encoding.UTF8);
|
||||
|
||||
return new WriterDiagnosticResult
|
||||
{
|
||||
@@ -132,6 +263,76 @@ namespace TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writers
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses a single CSV line while respecting quoted values.
|
||||
/// </summary>
|
||||
/// <param name="line">
|
||||
/// CSV line to parse.
|
||||
/// </param>
|
||||
/// <param name="delimiter">
|
||||
/// Character separating individual fields.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// Parsed CSV field values.
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// Thrown when the line contains an unterminated quoted value.
|
||||
/// </exception>
|
||||
private string[] ParseCsvLine(string line, char delimiter)
|
||||
{
|
||||
if (line == null)
|
||||
return new string[0];
|
||||
|
||||
List<string> values = new List<string>();
|
||||
StringBuilder currentValue = new StringBuilder();
|
||||
|
||||
bool insideQuotes = false;
|
||||
|
||||
for (int index = 0; index < line.Length; index++)
|
||||
{
|
||||
char character = line[index];
|
||||
|
||||
if (character == '"')
|
||||
{
|
||||
bool escapedQuote =
|
||||
insideQuotes &&
|
||||
index + 1 < line.Length &&
|
||||
line[index + 1] == '"';
|
||||
|
||||
if (escapedQuote)
|
||||
{
|
||||
currentValue.Append('"');
|
||||
index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
insideQuotes = !insideQuotes;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (character == delimiter && !insideQuotes)
|
||||
{
|
||||
values.Add(currentValue.ToString());
|
||||
currentValue.Clear();
|
||||
continue;
|
||||
}
|
||||
|
||||
currentValue.Append(character);
|
||||
}
|
||||
|
||||
if (insideQuotes)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"CSV line contains an unterminated quoted value.");
|
||||
}
|
||||
|
||||
values.Add(currentValue.ToString());
|
||||
|
||||
return values.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update mode:
|
||||
/// CSV has no natural SQL-style row update, so current implementation writes
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -24,14 +24,14 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB
|
||||
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0];
|
||||
public override XmlSerializer GetSerializer() { return Serializer; }
|
||||
|
||||
public double PulsesPerLtr; /// [l^-1]
|
||||
public string Units; /// [kg^-1]...MF
|
||||
public double PulsesPerLtr;
|
||||
public string Units;
|
||||
public int Filter;
|
||||
|
||||
public override void InitializeAll()
|
||||
{
|
||||
PulsesPerLtr = 1.0;
|
||||
Units = "---"; //...MF
|
||||
Units = "---";
|
||||
Filter = 0;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB
|
||||
Strings.Filter,
|
||||
};
|
||||
|
||||
//...MF
|
||||
|
||||
private void RefreshParamNames(int i) {
|
||||
if (i == 0)
|
||||
{
|
||||
@@ -56,12 +56,12 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB
|
||||
|
||||
public override string ParamName(int i)
|
||||
{
|
||||
//if(i==0) RefreshParamNames(0);//...MF
|
||||
//if(i==0) RefreshParamNames(0);
|
||||
return paramNames[i];
|
||||
}
|
||||
public override int ParamsCount() { return paramNames.Length; }
|
||||
|
||||
public ICollection<string> ParamValues(int ix)
|
||||
/*public ICollection<string> ParamValues(int ix)
|
||||
{
|
||||
var values = new List<string>();
|
||||
switch (ix)
|
||||
@@ -72,6 +72,33 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}*/
|
||||
|
||||
public ICollection<string> ParamValues(int ix)
|
||||
{
|
||||
switch (ix)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
var values = new List<string>
|
||||
{
|
||||
Unit.None.ToDescription()
|
||||
};
|
||||
|
||||
for (Unit unit = (Unit)1; unit < Unit.Count; unit++)
|
||||
{
|
||||
if (Common.Units.IsQuantity(unit, Quantity.MultiFunctionalVariables))
|
||||
{
|
||||
values.Add(unit.ToDescription());
|
||||
}
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString(int i)
|
||||
@@ -127,7 +154,7 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB
|
||||
void CopyContentTo(RRProcParams prms)
|
||||
{
|
||||
prms.PulsesPerLtr = this.PulsesPerLtr;
|
||||
prms.Units = this.Units; //...MF
|
||||
prms.Units = this.Units;
|
||||
prms.Filter = this.Filter;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,23 +24,23 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop
|
||||
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0];
|
||||
public override XmlSerializer GetSerializer() { return Serializer; }
|
||||
|
||||
public double PulsesPerLtr; /// Target low limit of the flow increase or decrease
|
||||
public string Units; /// [kg^-1]...MF
|
||||
public double PulsesPerLtr;
|
||||
public string Units;
|
||||
|
||||
public override void InitializeAll()
|
||||
{
|
||||
PulsesPerLtr = 1.0;
|
||||
Units = "---"; //...MF
|
||||
Units = "---";
|
||||
}
|
||||
|
||||
string[] paramNames = new string[]
|
||||
{
|
||||
//Strings.PulsesPerLtr,
|
||||
Strings.PulsesPerUnit,//...MF
|
||||
Strings.Units,//...MF
|
||||
Strings.PulsesPerUnit,
|
||||
Strings.Units,
|
||||
};
|
||||
|
||||
//...MF
|
||||
|
||||
private void RefreshParamNames(int i)
|
||||
{
|
||||
if (i == 0)
|
||||
@@ -54,7 +54,7 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop
|
||||
public override string ParamName(int i) { return paramNames[i]; }
|
||||
public override int ParamsCount() { return paramNames.Length; }
|
||||
|
||||
public ICollection<string> ParamValues(int ix)
|
||||
/*marek mareciinopublic ICollection<string> ParamValues(int ix)
|
||||
{
|
||||
var values = new List<string>();
|
||||
switch (ix)
|
||||
@@ -65,6 +65,33 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}*/
|
||||
|
||||
public ICollection<string> ParamValues(int ix)
|
||||
{
|
||||
switch (ix)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
var values = new List<string>
|
||||
{
|
||||
Unit.None.ToDescription()
|
||||
};
|
||||
|
||||
for (Unit unit = (Unit)1; unit < Unit.Count; unit++)
|
||||
{
|
||||
if (Common.Units.IsQuantity(unit, Quantity.MultiFunctionalVariables))
|
||||
{
|
||||
values.Add(unit.ToDescription());
|
||||
}
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString(int i)
|
||||
@@ -72,7 +99,7 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop
|
||||
switch (i)
|
||||
{
|
||||
case 0: return PulsesPerLtr.ToString();
|
||||
case 1: return Units;//...MF
|
||||
case 1: return Units;
|
||||
default: return string.Empty;
|
||||
}
|
||||
}
|
||||
@@ -113,7 +140,7 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop
|
||||
void CopyContentTo(RRProcParams prms)
|
||||
{
|
||||
prms.PulsesPerLtr = this.PulsesPerLtr;
|
||||
prms.Units = this.Units; //...MF
|
||||
prms.Units = this.Units;
|
||||
}
|
||||
|
||||
public IParamsProvider Clone()
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
///
|
||||
using Common;
|
||||
using log4net;
|
||||
///
|
||||
/// Copyright (c) 2018-2022 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using log4net;
|
||||
using Common;
|
||||
using System.Windows.Forms;
|
||||
using TBF.Boxes;
|
||||
using TBF.Resources;
|
||||
using TBF.Rig.GenericDevices;
|
||||
@@ -84,6 +85,8 @@ namespace TBF.Rig.TestMethods.StandingStart
|
||||
checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state
|
||||
processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null);
|
||||
|
||||
int delay;
|
||||
|
||||
if (cBrd is ControlBoard.Uni.UniCB)
|
||||
{
|
||||
int[] filters = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
@@ -120,8 +123,16 @@ namespace TBF.Rig.TestMethods.StandingStart
|
||||
|
||||
int totalPulses = Convert.ToInt32(test.Volume / outPath.FlowMeter.LtrPerPulse);
|
||||
|
||||
log.InfoFormat(
|
||||
"{0}({1}) : Test starting... (Repetition {2}, LastRepetition={3}, PumpPower={4})",
|
||||
test.Method,
|
||||
test.Name,
|
||||
repetitionNr,
|
||||
isLastRepetition,
|
||||
test.PumpPower);
|
||||
|
||||
///============================================================================================
|
||||
|
||||
|
||||
/// Read pressure and temperature once before calling Bridge.OnTestSelected(...)
|
||||
State.Create(string.Format("{0}({1}) : Measuring process data", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
@@ -373,6 +384,18 @@ namespace TBF.Rig.TestMethods.StandingStart
|
||||
/// Temperature is withing required range at this point
|
||||
///
|
||||
|
||||
///
|
||||
/// reading pump power for dynamic using as default test.PumpPower for next test instances in cycle
|
||||
///
|
||||
if (inPath.Pump is IPump)
|
||||
{
|
||||
test.PumpPower = (float)(inPath.Pump as IPump).Power;
|
||||
|
||||
log.InfoFormat(
|
||||
"PumpPower initialized from operator to '{0}'%",
|
||||
test.PumpPower);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
Bridge.OnActivity(this, Strings.Stopping_flow_for_the_fixed_start);
|
||||
//-----------------------------------------------------------------
|
||||
@@ -421,10 +444,40 @@ namespace TBF.Rig.TestMethods.StandingStart
|
||||
LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name);
|
||||
int startPulses = 0;
|
||||
|
||||
///
|
||||
/// Enter watermeter begin states here
|
||||
///
|
||||
GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm;
|
||||
///...MF
|
||||
///-----------------
|
||||
delay = test.TimeFlow2Mass;
|
||||
|
||||
if (delay > 0)
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Delay for meters stabilization <T flow stab. - start = {2}s> ", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 5
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((delay = Math.Max(delay, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
}
|
||||
while (!e.Contains(Event.TimerExpired));
|
||||
}
|
||||
|
||||
///
|
||||
/// Enter watermeter begin states here
|
||||
///
|
||||
GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm;
|
||||
|
||||
if (dataEntryCmpnt != null)
|
||||
{
|
||||
@@ -668,6 +721,35 @@ namespace TBF.Rig.TestMethods.StandingStart
|
||||
double volumeCTV = constMasterCorr * Convert.ToDouble(endPulses - startPulses);
|
||||
double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l]
|
||||
|
||||
///...MF
|
||||
///-----------------
|
||||
delay = test.TimeFlow2Mass;
|
||||
|
||||
if (delay > 0)
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Delay for meters stabilization <T flow stab. - start = {2}s> ", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 5
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((delay = Math.Max(delay, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
}
|
||||
while (!e.Contains(Event.TimerExpired));
|
||||
}
|
||||
|
||||
///
|
||||
/// Enter watermeter end states here
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
using Config.Entities;
|
||||
using log4net;
|
||||
using NHibernate.Action;
|
||||
using SharedComponents;
|
||||
|
||||
///
|
||||
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||
///
|
||||
@@ -488,31 +490,26 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
|
||||
///...MF
|
||||
///-----------------
|
||||
delay = 5;
|
||||
//if (test.TimePump2StartV > 0)
|
||||
//{
|
||||
State.Create(string.Format("{0}({1}) : Delay 5s", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 3
|
||||
.EnterState();
|
||||
do
|
||||
delay = test.TimeFlow2Mass;
|
||||
|
||||
if (delay > 0)
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
State.Create(string.Format("{0}({1}) : Delay for meters stabilization <T flow stab. - start = {2}s> ", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 5
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((delay = Math.Max(delay, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
}
|
||||
/// Show remaining time
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Start the standing start/stop test (diverter switch...)", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.TimerExpired));
|
||||
//}
|
||||
///-----------------
|
||||
}
|
||||
|
||||
State.Create(string.Format("{0}({1}) : Start the standing start/stop test", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
@@ -526,41 +523,12 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
}
|
||||
|
||||
///...MF
|
||||
///-----------------
|
||||
delay = test.TimeFlow2Mass;
|
||||
|
||||
if (delay > 0)
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Delay for meters stabilization <T flow stab. - start = {2}s> ", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 5
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((delay = Math.Max(delay, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
|
||||
|
||||
if(delay>0)
|
||||
delay--;
|
||||
}
|
||||
while (!e.Contains(Event.TimerExpired));
|
||||
}
|
||||
|
||||
int time = StateMachine.Time;
|
||||
double currentFlow = RefFlow.Val;
|
||||
|
||||
//------------------------------------------------
|
||||
Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//------------------------------------------------
|
||||
|
||||
LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name);
|
||||
@@ -574,6 +542,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm;
|
||||
IOperation readStartMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
|
||||
IOperation readStopMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
|
||||
IOperation readEndMassOp = scale.ReadStableMassOp(ref EndMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
|
||||
|
||||
if (dataEntryCmpnt != null)
|
||||
{
|
||||
@@ -657,13 +626,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((delay = Math.Max(delay, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Measuring the start mass", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.ModelessFormClosed) || !e.Contains(Event.ScaleDone));
|
||||
long readEndTime = StateMachine.Time;
|
||||
@@ -787,6 +750,9 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
retVal = Event.RecoverableError;
|
||||
goto stopTest;
|
||||
}
|
||||
|
||||
/// Show remaining time
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Measuring the start mass", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));
|
||||
}
|
||||
@@ -826,15 +792,6 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime));
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
|
||||
/// Update statistics
|
||||
RefFrequency.Val = cBrd.RefFrequency;
|
||||
RefFlow.Val = outPath.FlowMeter.ReadFlow();
|
||||
@@ -864,6 +821,12 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
|
||||
#endregion
|
||||
|
||||
/// Show remaining time
|
||||
if ((remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime));
|
||||
|
||||
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test));
|
||||
}
|
||||
while ((cBrd.DebugLevel==DebugMode.Simulate && !e.Contains(Event.FlowReached)) ||
|
||||
@@ -891,7 +854,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
log.WarnFormat("Start valve switch time on test end = {0} ms", cBrd.ValveOpenCloseTime);
|
||||
|
||||
|
||||
///...MF
|
||||
/*///...MF
|
||||
///-----------------
|
||||
delay = test.TimeStop2Mass;
|
||||
|
||||
@@ -919,7 +882,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
delay--;
|
||||
}
|
||||
while (!e.Contains(Event.TimerExpired));
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
if (heatMetersPath == null)
|
||||
@@ -928,17 +891,17 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
LogProcessDataHeaderHeatMeters(processDataLogger, "End mass");
|
||||
|
||||
//------------------------------------------------
|
||||
Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//------------------------------------------------
|
||||
/*
|
||||
|
||||
delay = test.TimeStop2Mass;
|
||||
|
||||
State.Create(string.Format("{0}({1}) : Measuring the end mass after residual flow <T stop-mass msrmt time = {2}s>", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
//.AddOperation(testInProgress)...nevhodne prepina diverter
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(scale.ReadStableMassOp(ref EndMass, delay, test.MassMethod, test.MassRepeats, test.MassSpread))//...develop: step 13
|
||||
.AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec))
|
||||
//.AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec))
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.EnterState();
|
||||
do {
|
||||
@@ -953,15 +916,9 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
}
|
||||
|
||||
/// Show remaining time
|
||||
if ((delay = Math.Max(delay, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Measuring the end mass", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));*/
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));
|
||||
///
|
||||
tMass2 = StateMachine.Time;
|
||||
|
||||
@@ -982,21 +939,21 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
///
|
||||
if (dataEntryCmpnt != null)
|
||||
{
|
||||
string fileName = string.Format("{0}-{1}-end.bmp", test.Name, repetitionNr); //string.Format("{0}-end.bmp", test.Name);
|
||||
string fileName = string.Format("{0}-{1}-end.bmp", test.Name, repetitionNr); //string.Format("{0}-end.bmp", test.Name);
|
||||
|
||||
IValve triggerValve = null;
|
||||
bool triggerSend = false;
|
||||
if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera)
|
||||
{
|
||||
string[] endImages = new string[sensPath.RegisterReaders.Length];
|
||||
{
|
||||
string[] endImages = new string[sensPath.RegisterReaders.Length];
|
||||
|
||||
State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp);
|
||||
for (int i = 0; i < sensPath.RegisterReaders.Length; i++)
|
||||
{
|
||||
GenericDevices.IRegReaderStillCamera roi = sensPath.RegisterReaders[i] as GenericDevices.IRegReaderStillCamera;
|
||||
{
|
||||
GenericDevices.IRegReaderStillCamera roi = sensPath.RegisterReaders[i] as GenericDevices.IRegReaderStillCamera;
|
||||
if (roi != null)
|
||||
{
|
||||
{
|
||||
///if exist valve trigger camera open
|
||||
triggerValve = roi.GetValve();
|
||||
if (triggerValve != null && !triggerSend)
|
||||
@@ -1010,6 +967,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
endImages[i] = Path.Combine(directory, fileName);
|
||||
state2.AddOperation(roi.GrabImageOp(endImages[i]));
|
||||
state2.AddOperation(testInProgress);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1048,22 +1006,24 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
state.AddOperation((dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).
|
||||
ShowTestEndFormOp(sensPath.RegisterReaders,
|
||||
volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty,
|
||||
refEnergy, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty));
|
||||
refEnergy, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); //...develop: half of step 14
|
||||
}
|
||||
else
|
||||
{
|
||||
state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders,
|
||||
volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty));
|
||||
state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders,
|
||||
volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); //...develop: half of step 14
|
||||
}
|
||||
|
||||
state.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
//.AddOperation(testInProgress)
|
||||
//.AddOperation(readEndMassOp) //...develop: half of step 14 + step 15
|
||||
.EnterState();
|
||||
do {
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
}
|
||||
while (!e.Contains(Event.ModelessFormClosed));
|
||||
while (!e.Contains(Event.ModelessFormClosed)) ;
|
||||
|
||||
|
||||
if (heatMetersTestParams != null)
|
||||
@@ -1087,7 +1047,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
{
|
||||
for (int i = 0; i < waterMetersCount; i++)
|
||||
{
|
||||
GenericDevices.IRegReader rr = sensPath.RegisterReaders[i];
|
||||
GenericDevices.IRegReader rr = sensPath.RegisterReaders[i];
|
||||
|
||||
if (rr is ICommonRegReader)
|
||||
(rr as ICommonRegReader).EndWMState = dataEntryCmpnt.WMEndState(i);
|
||||
@@ -1112,7 +1072,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
}
|
||||
|
||||
if (dataEntryCmpnt is IDataEntryForCamera && (dataEntryCmpnt as IDataEntryForCamera).SaveImages)
|
||||
{
|
||||
{
|
||||
log.Debug("Save images EndWMState...");
|
||||
/// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle
|
||||
for (int i = 0; i < sensPath.RegisterReaders.Length; i++)
|
||||
@@ -1180,7 +1140,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
tstRslt.EndTime = TestEndTime;
|
||||
tstRslt.FlowSetTime = flowSetTime;
|
||||
tstRslt.TestTime = Math.Max(1.0, DateTimeBox.DurationSec(timeStampStart, timeStampEnd)); /// Min. 1s to prevent division by zero
|
||||
tstRslt.PulsesMaster = Convert.ToDouble(cBrd.RefPulses); /// Pulses of the master flow meter (test total)
|
||||
tstRslt.PulsesMaster = Convert.ToDouble(cBrd.RefPulses);/// Pulses of the master flow meter (test total)
|
||||
tstRslt.MassStartRaw = StartMass.Val;
|
||||
tstRslt.MassEndRaw = EndMass.Val;
|
||||
tstRslt.TimeBtwnMassMsrmnts = tMass2 - tMass1;
|
||||
@@ -1212,6 +1172,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
|
||||
tstRslt.ConstMasterRaw = 1; /// Uncorrected master flowmeter coefficient
|
||||
tstRslt.ConstMasterCorr = 1; /// Corrected master pulses per liter
|
||||
tstRslt.ConstMaster = 1;
|
||||
tstRslt.MassConstMaster = 1;
|
||||
}
|
||||
tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV);
|
||||
tstRslt.MassErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.MassCTV);
|
||||
|
||||
+195
-51
@@ -1,14 +1,16 @@
|
||||
///
|
||||
using Common;
|
||||
using Config.Entities;
|
||||
using FluentNHibernate.Conventions;
|
||||
using log4net;
|
||||
///
|
||||
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using Common;
|
||||
using Config.Entities;
|
||||
using FluentNHibernate.Conventions;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml.Serialization;
|
||||
using TBF.Boxes;
|
||||
using TBF.Resources;
|
||||
using TBF.Rig.Generic;
|
||||
@@ -16,6 +18,7 @@ using TBF.Rig.GenericDevices;
|
||||
using TBF.Rig.Network.RestAPI;
|
||||
using TBF.Rig.Operations;
|
||||
using TBF.Rig.Sequences;
|
||||
using TBF.Rig.Various.ErrorFlags;
|
||||
using TBF.UiBridge;
|
||||
|
||||
namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
@@ -115,6 +118,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state
|
||||
processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null);
|
||||
|
||||
int delay;
|
||||
|
||||
if (cBrd is ControlBoard.Uni.UniCB)
|
||||
{
|
||||
int[] filters = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
@@ -332,8 +337,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(cBrd.SetFlowOp(test.QfromM3ph(), test.QtoM3ph(), RefFlow, FlowSettingTimeoutSec))
|
||||
.AddOperation(heatMetersPromptOp)
|
||||
.AddOperation(cBrd.SetFlowOp(test.QfromM3ph(), test.QtoM3ph(), RefFlow, FlowSettingTimeoutSec))//...develop: step 1
|
||||
.AddOperation(heatMetersPromptOp)
|
||||
.EnterState();
|
||||
do {
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
@@ -454,8 +459,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
State.Create(string.Format("{0}({1}) : Close the start/stop valve before measuring the start mass", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(cBrd.CloseStartValveOp())
|
||||
.EnterState();
|
||||
.AddOperation(cBrd.CloseStartValveOp())//...develop: step 2
|
||||
.EnterState();
|
||||
do {
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
@@ -463,10 +468,33 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
}
|
||||
while (!e.Contains(Event.ValvesSet));
|
||||
|
||||
///...MF
|
||||
///-----------------
|
||||
delay = test.TimeFlow2Mass;
|
||||
|
||||
if (delay > 0)
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Delay for meters stabilization <T flow stab. - start = {2}s> ", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 5
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Start the standing start/stop test (diverter switch...)", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.TimerExpired));
|
||||
}
|
||||
|
||||
State.Create(string.Format("{0}({1}) : Start the standing start/stop test", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(testInProgress)//...develop: step 4 --> diverter switch to the mass
|
||||
.EnterState();
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
@@ -479,7 +507,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
double currentFlow = RefFlow.Val;
|
||||
|
||||
//------------------------------------------------
|
||||
Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//------------------------------------------------
|
||||
|
||||
LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name);
|
||||
@@ -492,6 +520,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
///
|
||||
GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm;
|
||||
IOperation readStartMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
|
||||
IOperation readStopMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
|
||||
IOperation readEndMassOp = scale.ReadStableMassOp(ref EndMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
|
||||
|
||||
if (dataEntryCmpnt != null)
|
||||
{
|
||||
@@ -510,7 +540,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
State state2 = State.Create(string.Format("{0}({1}) : Grab images", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(readStartMassOp)
|
||||
//.AddOperation(readStartMassOp)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(processDataLoggingOp);
|
||||
|
||||
@@ -562,20 +592,24 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
string.Format("{0}({1}) : Grabbing images - valve close", test.Method, test.Name));
|
||||
}
|
||||
///////
|
||||
|
||||
delay = test.TimeStop2Mass;
|
||||
|
||||
Bridge.OnActivity(this, Strings.Grabbing_images);//Strings.Enter_water_meter_data);
|
||||
State.Create(string.Format("{0}({1}) : Enter start states of water meters", test.Method, test.Name))
|
||||
State.Create(string.Format("{0}({1}) : Enter start states of water meters and Measuring the start mass after residual flow <T stop-mass msrmt time = {2}s>", test.Method, test.Name, test.TimeStop2Mass))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(readStartMassOp)
|
||||
//.AddOperation(readStartMassOp)
|
||||
.AddOperation(testInProgress)
|
||||
//.AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders))
|
||||
//.AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders))//...develop: half of step 6
|
||||
.AddOperation(readStopMassOp) //...develop: half of step 6
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.EnterState();
|
||||
do {
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Measuring the start mass", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone/*Event.ModelessFormClosed*/));
|
||||
|
||||
@@ -654,10 +688,31 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)//...nevhodne prepina diverter
|
||||
.AddOperation(scale.ReadStableMassOp(ref StartMass, 0, test.MassMethod, test.MassRepeats, test.MassSpread))//...develop: step 8
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
if (e.Contains(Event.ScaleTimeout))
|
||||
{
|
||||
Bridge.OnError(this, Strings.Mass_measurement_timeout);
|
||||
retVal = Event.RecoverableError;
|
||||
goto stopTest;
|
||||
}
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));
|
||||
}
|
||||
else
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name))
|
||||
/*State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
@@ -675,6 +730,30 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
goto stopTest;
|
||||
}
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));*/
|
||||
State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)//...nevhodne prepina diverter
|
||||
//.AddOperation(readStartMassOp)
|
||||
.AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread))
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
if (e.Contains(Event.ScaleTimeout))
|
||||
{
|
||||
Bridge.OnError(this, Strings.Mass_measurement_timeout);
|
||||
retVal = Event.RecoverableError;
|
||||
goto stopTest;
|
||||
}
|
||||
|
||||
/// Show remaining time
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Measuring the start mass", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));
|
||||
}
|
||||
///
|
||||
@@ -702,10 +781,10 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
State.Create(string.Format("{0}({1}) : Start the test, open the start/stop valve", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(cBrd.OpenStartValveOp(timeStampStart, startSwitchTime))
|
||||
.AddOperation(cBrd.OpenStartValveOp(timeStampStart, startSwitchTime)) //...develop: step 9
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(controlFlowOp)
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.AddOperation(processDataLoggingOp)//...develop: step 10, step 11
|
||||
.EnterState();
|
||||
do {
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
@@ -713,12 +792,6 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
|
||||
|
||||
/// Show remaining time
|
||||
if ((remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime));
|
||||
|
||||
/// Update statistics
|
||||
RefFrequency.Val = cBrd.RefFrequency;
|
||||
RefFlow.Val = outPath.FlowMeter.ReadFlow();
|
||||
@@ -748,6 +821,12 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
|
||||
#endregion
|
||||
|
||||
/// Show remaining time
|
||||
if ((remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0)) > 60)
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec));
|
||||
else
|
||||
Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime));
|
||||
|
||||
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test));
|
||||
}
|
||||
while ((cBrd.DebugLevel==DebugMode.Simulate && !e.Contains(Event.FlowReached)) ||
|
||||
@@ -763,7 +842,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(cBrd.CloseStartValveOp(timeStampEnd, stopSwitchTime))
|
||||
.AddOperation(cBrd.CloseStartValveOp(timeStampEnd, stopSwitchTime))//...develop: step 12
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.EnterState();
|
||||
do {
|
||||
@@ -780,14 +859,17 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
LogProcessDataHeaderHeatMeters(processDataLogger, "End mass");
|
||||
|
||||
//------------------------------------------------
|
||||
Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//Bridge.OnActivity(this, Strings.Measuring_the_weight);
|
||||
//------------------------------------------------
|
||||
State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name))
|
||||
|
||||
delay = test.TimeStop2Mass;
|
||||
|
||||
State.Create(string.Format("{0}({1}) : Measuring the end mass after residual flow <T stop-mass msrmt time = {2}s>", test.Method, test.Name, delay))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperations(readTempPressOps)
|
||||
.AddOperation(testInProgress)
|
||||
.AddOperation(scale.ReadStableMassOp(ref EndMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread))
|
||||
.AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec))
|
||||
//.AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec))
|
||||
.AddOperation(processDataLoggingOp)
|
||||
.EnterState();
|
||||
do {
|
||||
@@ -800,26 +882,14 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
retVal = Event.RecoverableError;
|
||||
goto stopTest;
|
||||
}
|
||||
|
||||
/// Show remaining time
|
||||
Bridge.OnDelayActivity(this, "Delayed activity: Measuring the end mass", ref delay);
|
||||
}
|
||||
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));
|
||||
///
|
||||
tMass2 = StateMachine.Time;
|
||||
|
||||
if (test.DoDrainingAfter)
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperation(cBrd.SetValvesOp(scale.DrainValve, null))
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
}
|
||||
while (e.Contains(Event.ValvesBusy));
|
||||
}
|
||||
|
||||
|
||||
double massStart = MeasurementCorrection.CorrectedValue(StartMass.Val, scale.Corrections);
|
||||
double massEnd = MeasurementCorrection.CorrectedValue(EndMass.Val, scale.Corrections);
|
||||
double densityOut = Formulas.WaterDensityFromTempPress((TempUpStat.Average + TempDownStat.Average) / 2,
|
||||
@@ -827,7 +897,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
double buoyancy = Formulas.Buoyancy();
|
||||
double massOfEvaporatedWater = (double)(tMass2 - tMass1) * outPath.Scale.EvaporationRate(TempDivStat.Average);
|
||||
double volumeCTV = 1000.0 * buoyancy * (massEnd - massStart + massOfEvaporatedWater) / densityOut;
|
||||
if (debugLevel == Common.DebugMode.Simulate) volumeCTV = test.Volume;
|
||||
double massCTV = buoyancy * (massEnd - massStart + massOfEvaporatedWater);
|
||||
if (debugLevel == Common.DebugMode.Simulate) volumeCTV = test.Volume;
|
||||
|
||||
double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l]
|
||||
|
||||
@@ -1000,6 +1071,20 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
}
|
||||
}
|
||||
|
||||
if (test.DoDrainingAfter)
|
||||
{
|
||||
State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name))
|
||||
.AddOperation(checkUiOp)
|
||||
.AddOperation(cBrd.SetValvesOp(scale.DrainValve, null))
|
||||
.EnterState();
|
||||
do
|
||||
{
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
|
||||
}
|
||||
while (e.Contains(Event.ValvesBusy));
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
Bridge.OnActivity(this, Strings.Test_completed);
|
||||
//------------------------------------------------
|
||||
@@ -1037,6 +1122,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
/// Main results
|
||||
tstRslt.VolumeCTV = volumeCTV; /// [l] 1000.0f is because density is in [kg/m3]
|
||||
tstRslt.Flow = 3.6 * volumeCTV / tstRslt.TestTime; /// [m3/h]
|
||||
tstRslt.MassCTV = massCTV; /// [kg] 1000.0f is because density is in [kg/m3]
|
||||
tstRslt.MassFlow = 3.6 * massCTV / tstRslt.TestTime; /// [kg/h]
|
||||
|
||||
if (cBrd is ControlBoard.Uni.UniCB)
|
||||
{
|
||||
@@ -1045,6 +1132,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.Flow, tstRslt.TempDownMean);
|
||||
tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter
|
||||
tstRslt.ConstMaster = (tstRslt.VolumeMaster != 0) ? (tstRslt.ConstMasterRaw * tstRslt.VolumeCTV / tstRslt.VolumeMaster) : tstRslt.ConstMasterCorr;
|
||||
tstRslt.MassConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.MassCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1204,18 +1292,74 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance
|
||||
if (meterRslt != null && regReader != null)
|
||||
{
|
||||
meterRslt.RegReaderType = (int)regReader.RegisterReaderType;
|
||||
ComponentProcedure procParamsEntity = test.Procedure.GetProcedureParamsEntity(regReader.Name);
|
||||
|
||||
try
|
||||
{
|
||||
if (regReader.RegisterReaderType == RegisterReaderType.Pulses)
|
||||
{
|
||||
XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TBF.Rig.RegisterReaders.PulsesFromUniCB.RRProcParams) })[0];
|
||||
TBF.Rig.RegisterReaders.PulsesFromUniCB.RRProcParams tmp = Serializer.Deserialize(new StringReader(procParamsEntity.Parameters.ToString())) as TBF.Rig.RegisterReaders.PulsesFromUniCB.RRProcParams;
|
||||
regReader.PulsesPerLtr = tmp.PulsesPerLtr;
|
||||
regReader.QuantityUnits = tmp.Units;
|
||||
}
|
||||
else if (regReader.RegisterReaderType == RegisterReaderType.Manual)
|
||||
{
|
||||
XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TBF.Rig.RegisterReaders.StandingStartStop.RRProcParams) })[0];
|
||||
TBF.Rig.RegisterReaders.StandingStartStop.RRProcParams tmp = Serializer.Deserialize(new StringReader(procParamsEntity.Parameters.ToString())) as TBF.Rig.RegisterReaders.StandingStartStop.RRProcParams;
|
||||
regReader.PulsesPerLtr = tmp.PulsesPerLtr;
|
||||
regReader.QuantityUnits = tmp.Units;
|
||||
}
|
||||
else
|
||||
{
|
||||
//MessageBox.Show("Cannot create or initialize a printer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.ErrorFormat(string.Format("Error during RegisterReader parameters deserialization. regReader.Name='{0}', regReader.ClassName='{1}', Exception: {2}",
|
||||
regReader.Name,
|
||||
regReader.ClassName,
|
||||
ex));
|
||||
}
|
||||
|
||||
meterRslt.PulsesPerLiter = regReader.PulsesPerLtr;
|
||||
meterRslt.VolumeStart = 0.0d;//regReader.BeginWMState;
|
||||
meterRslt.VolumeEnd = 0.0d;//regReader.EndWMState;
|
||||
meterRslt.VolumeMeter = 0.0d;//Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart);
|
||||
meterRslt.VolumeStart = regReader.BeginWMState;//0.0d;//regReader.BeginWMState;
|
||||
meterRslt.VolumeEnd = regReader.EndWMState;//0.0d;//regReader.EndWMState;
|
||||
meterRslt.VolumeMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart);//0.0d;//Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart);
|
||||
meterRslt.MassMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart);
|
||||
meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter
|
||||
meterRslt.MassRef = tstRslt.MassCTV; /// kg
|
||||
meterRslt.PulsesMeter = meterRslt.VolumeMeter;
|
||||
meterRslt.PulsesMaster = tstRslt.PulsesMaster;
|
||||
meterRslt.TestTime = tstRslt.TestTime;
|
||||
meterRslt.Error = 100.0d;//Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef);
|
||||
meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty)
|
||||
//meterRslt.Error = 100.0d;//Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef);
|
||||
double Error = 0;
|
||||
if (meterRslt.GetQuantityFromUnits() == "Mass")
|
||||
Error = Formulas.ErrorFromVolumes(meterRslt.MassMeter, meterRslt.MassRef);
|
||||
else
|
||||
Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef);
|
||||
|
||||
meterRslt.Error = Error;
|
||||
/*meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty)
|
||||
&& (meterRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty)
|
||||
&& (tstRslt.ErrorFlags == 0);
|
||||
&& (tstRslt.ErrorFlags == 0);*/
|
||||
var ErrLimLo_Volume = test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime);
|
||||
var ErrLimHi_Volume = test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime);
|
||||
var ErrLimLo_Mass = test.GetErrLimLo(tstRslt.MassCTV, tstRslt.TestTime);
|
||||
var ErrLimHi_Mass = test.GetErrLimHi(tstRslt.MassCTV, tstRslt.TestTime);
|
||||
|
||||
bool Passed;
|
||||
if (meterRslt.GetQuantityFromUnits() == "Mass")
|
||||
Passed = (meterRslt.Error >= ErrLimLo_Volume + test.Uncertainty) &&
|
||||
(meterRslt.Error <= ErrLimHi_Volume - test.Uncertainty) &&
|
||||
(tstRslt.ErrorFlags == 0);
|
||||
else
|
||||
Passed = (meterRslt.Error >= ErrLimLo_Mass + test.Uncertainty) &&
|
||||
(meterRslt.Error <= ErrLimHi_Mass - test.Uncertainty) &&
|
||||
(tstRslt.ErrorFlags == 0);
|
||||
|
||||
meterRslt.Passed = Passed;
|
||||
meterRslt.TestDone = false;
|
||||
tstRslt.TestDone = false;
|
||||
tstRslt.TestMeasured = true;
|
||||
|
||||
+38
-3
@@ -51,7 +51,7 @@
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;CAMERA;LANG_PL;IPERL;</DefineConstants>
|
||||
<DefineConstants>TRACE;CAMERA;IPERL;</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@@ -108,6 +108,21 @@
|
||||
<Reference Include="Castle.Core, Version=5.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Castle.Core.5.1.1\lib\net462\Castle.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ClosedXML, Version=0.105.0.0, Culture=neutral, PublicKeyToken=fd1eb21b62ae805b, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ClosedXML.0.105.0\lib\netstandard2.0\ClosedXML.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ClosedXML.Parser, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1d5f7376574c51ec, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ClosedXML.Parser.2.0.0\lib\netstandard2.0\ClosedXML.Parser.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DocumentFormat.OpenXml, Version=3.1.1.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\DocumentFormat.OpenXml.3.1.1\lib\net46\DocumentFormat.OpenXml.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DocumentFormat.OpenXml.Framework, Version=3.1.1.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\DocumentFormat.OpenXml.Framework.3.1.1\lib\net46\DocumentFormat.OpenXml.Framework.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ExcelNumberFormat, Version=1.1.0.0, Culture=neutral, PublicKeyToken=23c6f5d73be07eca, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ExcelNumberFormat.1.1.0\lib\net20\ExcelNumberFormat.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="FluentNHibernate">
|
||||
<HintPath>..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -120,6 +135,9 @@
|
||||
<Reference Include="Logic.ProductionToProductMapper">
|
||||
<HintPath>..\packages\Common\Logic.ProductionToProductMapper.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Bcl.HashCode, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="mscorlib" />
|
||||
<Reference Include="MySql.Data">
|
||||
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
|
||||
@@ -141,10 +159,19 @@
|
||||
<HintPath>..\packages\Oracle.ManagedDataAccess.19.11.0\lib\net40\Oracle.ManagedDataAccess.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="RBush, Version=4.0.0.0, Culture=neutral, PublicKeyToken=c77e27b81f4d0187, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\RBush.Signed.4.0.0\lib\net47\RBush.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Renci.SshNet">
|
||||
<HintPath>..\packages\Renci.SshNet\Renci.SshNet.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SixLabors.Fonts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d998eea7b14cab13, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SixLabors.Fonts.1.0.0\lib\netstandard2.0\SixLabors.Fonts.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
@@ -157,13 +184,19 @@
|
||||
<HintPath>..\packages\System.Drawing.Common.9.0.5\lib\net462\System.Drawing.Common.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Security" />
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
@@ -173,6 +206,7 @@
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="Xylem.Common.CommonCore">
|
||||
<HintPath>..\packages\Common\Xylem.Common.CommonCore.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -1223,6 +1257,7 @@
|
||||
<Compile Include="Rig\Output\DataStorage\UniDataStorageWriter\UI\WriterCfgCtrl.designer.cs">
|
||||
<DependentUpon>WriterCfgCtrl.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Rig\Output\DataStorage\UniDataStorageWriter\Writers\XlsxWriter.cs" />
|
||||
<Compile Include="Rig\Output\DB\DatabaseWriter\Factory.cs" />
|
||||
<Compile Include="Rig\Output\DB\DatabaseWriter\WriteDBCfgCtrl.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
|
||||
@@ -410,12 +410,12 @@ namespace TBF.UI.Procedures
|
||||
LoadUISettings();
|
||||
|
||||
/// Enable/disable/show/hide controls in General tab
|
||||
#if LANG_PL
|
||||
//#if LANG_PL
|
||||
altProcNameLabel.Visible = true;
|
||||
altProcNameTextBox.Visible = true;
|
||||
//altProcPeriodLabel.Visible = true;
|
||||
//altProcPeriodTextBox.Visible = true;
|
||||
#endif
|
||||
//#endif
|
||||
procNameTextBox.Enabled = false;
|
||||
descriptionTextBox.Enabled = false;
|
||||
variantTextBox.Enabled = false;
|
||||
|
||||
@@ -9,6 +9,7 @@ using NHibernate;
|
||||
using Common;
|
||||
using Config.Entities;
|
||||
using SharedDatabase.Entities;
|
||||
using Config.Resources;
|
||||
|
||||
namespace TBF.UiBridge
|
||||
{
|
||||
@@ -334,5 +335,35 @@ namespace TBF.UiBridge
|
||||
catch (Exception e) { log.Error("SetpointChangeHandler(...) failed", e); }
|
||||
}
|
||||
public static event EventHandler<SetpointChangeArgs> SetpointChangeHandler;
|
||||
|
||||
public static void OnDelayActivity(object sender, string nextAction, ref int delay)
|
||||
{
|
||||
delay = Math.Max(delay, 0);
|
||||
|
||||
string activity;
|
||||
|
||||
if (delay > 60)
|
||||
{
|
||||
activity = string.Format(
|
||||
"{0} in {1} min {2} {3}",
|
||||
nextAction,
|
||||
delay / 60,
|
||||
delay % 60,
|
||||
Strings.sec);
|
||||
}
|
||||
else
|
||||
{
|
||||
activity = string.Format(
|
||||
"{0} in {1} {2}",
|
||||
nextAction,
|
||||
delay,
|
||||
Strings.sec);
|
||||
}
|
||||
|
||||
OnActivity(sender, activity);
|
||||
|
||||
if (delay > 0)
|
||||
delay--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +83,22 @@
|
||||
<assemblyIdentity name="Xylem.Common.Utils.ByteArrayStyle" publicKeyToken="null" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-2.8.18.24507" newVersion="2.8.18.24507" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
<oracle.manageddataaccess.client>
|
||||
|
||||
+12
-1
@@ -1,18 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Castle.Core" version="5.1.1" targetFramework="net472" />
|
||||
<package id="ClosedXML" version="0.105.0" targetFramework="net48" />
|
||||
<package id="ClosedXML.Parser" version="2.0.0" targetFramework="net48" />
|
||||
<package id="DocumentFormat.OpenXml" version="3.1.1" targetFramework="net48" />
|
||||
<package id="DocumentFormat.OpenXml.Framework" version="3.1.1" targetFramework="net48" />
|
||||
<package id="ExcelNumberFormat" version="1.1.0" targetFramework="net48" />
|
||||
<package id="FluentNHibernate" version="2.0.3.0" targetFramework="net40" />
|
||||
<package id="Iesi.Collections" version="4.0.0.4000" targetFramework="net40" />
|
||||
<package id="log4net" version="2.0.15" targetFramework="net472" />
|
||||
<package id="Microsoft.Bcl.HashCode" version="1.1.1" targetFramework="net48" />
|
||||
<package id="MySql.Data" version="6.6.5" targetFramework="net20" requireReinstallation="true" />
|
||||
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net48" />
|
||||
<package id="NHibernate" version="4.0.4.4000" targetFramework="net40" />
|
||||
<package id="NLog" version="5.2.2" targetFramework="net48" />
|
||||
<package id="Oracle.ManagedDataAccess" version="19.11.0" targetFramework="net472" />
|
||||
<package id="RBush.Signed" version="4.0.0" targetFramework="net48" />
|
||||
<package id="SixLabors.Fonts" version="1.0.0" targetFramework="net48" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
|
||||
<package id="System.Data.SQLite" version="1.0.90.0" targetFramework="net40" requireReinstallation="true" />
|
||||
<package id="System.Drawing.Common" version="9.0.5" targetFramework="net472" />
|
||||
<package id="System.Memory" version="4.5.5" targetFramework="net48" />
|
||||
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.0" targetFramework="net48" />
|
||||
<package id="System.Threading" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user