diff --git a/AppDiagnostic/App.config b/AppDiagnostic/App.config
new file mode 100644
index 000000000..7f5eaea7b
--- /dev/null
+++ b/AppDiagnostic/App.config
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AppDiagnostic/AppDiagnostic.csproj b/AppDiagnostic/AppDiagnostic.csproj
new file mode 100644
index 000000000..65f8e8e7a
--- /dev/null
+++ b/AppDiagnostic/AppDiagnostic.csproj
@@ -0,0 +1,101 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}
+ WinExe
+ AppDiagnostic
+ AppDiagnostic
+ v4.7.2
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\log4net.3.0.3\lib\net462\log4net.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Component
+
+
+
+
+
+ Form
+
+
+ MainForm.cs
+
+
+
+
+ MainForm.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+ {8f942729-f454-4c99-ba6c-746962065ae3}
+ SharedComponents
+
+
+
+
\ No newline at end of file
diff --git a/AppDiagnostic/BufferedListView.cs b/AppDiagnostic/BufferedListView.cs
new file mode 100644
index 000000000..c33523f7f
--- /dev/null
+++ b/AppDiagnostic/BufferedListView.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+public class BufferedListView : ListView
+{
+ public BufferedListView()
+ {
+ // Zapne dvojité bufferovanie pre ListView
+ this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
+ this.UpdateStyles();
+ }
+}
\ No newline at end of file
diff --git a/AppDiagnostic/DiagApi.cs b/AppDiagnostic/DiagApi.cs
new file mode 100644
index 000000000..2ea6b1064
--- /dev/null
+++ b/AppDiagnostic/DiagApi.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace AppDiagnostic
+{
+ public class DiagApi
+ {
+ private static MainForm diagWindow; // Udržiava referenciu na existujúce okno
+
+ public DiagApi()
+ {
+ if (diagWindow == null || diagWindow.IsDisposed) // Ak okno neexistuje, vytvoríme ho
+ {
+ diagWindow = new MainForm();
+ diagWindow.FormClosing += (s, e) =>
+ {
+ diagWindow = null; // Keď sa zavrie, vyčistíme referenciu
+ };
+ diagWindow.Show();
+ }
+ else
+ {
+ diagWindow.BringToFront(); // Ak už beží, len ho presunieme na vrch
+ diagWindow.WindowState = FormWindowState.Normal; // Ak je minimalizované, obnovíme ho
+ }
+ }
+ }
+}
diff --git a/AppDiagnostic/LogAdapter.cs b/AppDiagnostic/LogAdapter.cs
new file mode 100644
index 000000000..33a351c7e
--- /dev/null
+++ b/AppDiagnostic/LogAdapter.cs
@@ -0,0 +1,174 @@
+using SharedComponents;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace AppDiagnostic
+{
+ public class LogAdapter
+ {
+ private ListView _listView;
+ public string _filterText = string.Empty;
+ private bool _isUserScrolling = false; // Indikátor, že používateľ manuálne scrolluje
+ private bool _autoScrollEnabled = true; // Indikátor, že automatické scrollovanie je povolené
+ private Timer _refreshTimer;
+ private const int RefreshInterval = 1000;
+
+ public LogAdapter(ListView listView)
+ {
+ _listView = listView;
+
+ // Nastavenie ListView
+ _listView.View = View.Details;
+ _listView.Columns.Clear();
+ _listView.Columns.Add("Logs");
+
+ _listView.Scrollable = true;
+
+ // Nastavenie šírky stĺpca na celú šírku ListView
+ AdjustColumnWidth();
+
+ // Udalosť pre dynamickú zmenu veľkosti stĺpca pri zmene veľkosti ListView
+ _listView.Resize += (sender, args) => AdjustColumnWidth();
+
+ // Pridanie udalosti pre manuálne skrolovanie
+ _listView.MouseWheel += ListView_MouseWheel;
+
+ // Inicializácia časovača na pravidelný refresh
+ _refreshTimer = new Timer { Interval = RefreshInterval };
+ _refreshTimer.Tick += (sender, args) => RefreshListView();
+ _refreshTimer.Start();
+ }
+
+ private void ListView_MouseWheel(object sender, MouseEventArgs e)
+ {
+ _isUserScrolling = true;
+
+ // Ak sa manuálnym scrollovaním používateľ dostane na koniec, obnovíme automatické scrollovanie
+ if (IsOnLastItem())
+ {
+ _isUserScrolling = false;
+ _autoScrollEnabled = true;
+ }
+ else
+ {
+ _autoScrollEnabled = false;
+ }
+ }
+
+ public void RefreshListView()
+ {
+ //LiveLogCache.Instance.AddLog(string.Format("-------------------------------RunDeviceAfter()-------------------------------"));
+
+ if (_listView.InvokeRequired)
+ {
+ _listView.Invoke(new Action(RefreshListView));
+ return;
+ }
+
+ _listView.BeginUpdate();
+ try
+ {
+ // Získanie pozície prvého viditeľného prvku pre stabilizáciu scrollovania
+ int topIndexBeforeRefresh = _listView.TopItem?.Index ?? 0;
+
+ // Pred pridaním nových položiek si pamätáme, či bol používateľ na poslednej položke
+ bool wasOnLastItem = IsOnLastItem();
+
+ // Uchovanie aktuálne označených položiek (indexov)
+ var selectedIndices = _listView.SelectedIndices.Cast().ToList();
+
+ // Načítanie logov
+ var logs = LiveLogCache.Instance.GetLogs(0, LiveLogCache.Instance.GetCount())
+ .Where(log => string.IsNullOrEmpty(_filterText) ||
+ log.IndexOf(_filterText, StringComparison.OrdinalIgnoreCase) >= 0)
+ .ToList();
+
+ // Vymazanie existujúcich položiek a pridanie nových
+ _listView.Items.Clear();
+
+ foreach (var log in logs)
+ {
+ var item = new ListViewItem(log)
+ {
+ BackColor = _listView.Items.Count % 2 == 0 ? Color.White : Color.FromArgb(240, 240, 240)
+ };
+ _listView.Items.Add(item);
+ }
+
+ // Obnovenie označených položiek
+ foreach (var index in selectedIndices)
+ {
+ if (index < _listView.Items.Count)
+ {
+ _listView.Items[index].Selected = true;
+ }
+ }
+
+ // Ak bol používateľ na poslednom prvku, nastavíme focus a scroll na posledný prvok
+ if (_autoScrollEnabled && wasOnLastItem && _listView.Items.Count > 0)
+ {
+ var lastItemIndex = _listView.Items.Count - 1;
+ _listView.EnsureVisible(lastItemIndex);
+ _listView.Items[lastItemIndex].Focused = true;
+ }
+ else
+ {
+ // Ak používateľ nebol na spodku, vrátime sa na predchádzajúcu pozíciu scrollu
+ if (topIndexBeforeRefresh < _listView.Items.Count)
+ {
+ _listView.TopItem = _listView.Items[topIndexBeforeRefresh];
+ }
+ }
+ }
+ finally
+ {
+ _listView.EndUpdate();
+ }
+ }
+
+
+
+ public void ApplyFilter(string filterText)
+ {
+ _filterText = filterText?.Trim() ?? string.Empty;
+ RefreshListView();
+ }
+
+ private bool IsOnLastItem()
+ {
+ if (_listView.Items.Count == 0)
+ return false;
+
+ // Získame poslednú položku
+ int lastItemIndex = _listView.Items.Count - 1;
+ var lastItem = _listView.Items[lastItemIndex];
+
+ // Overíme, či je posledná položka úplne viditeľná
+ return lastItem.Bounds.Bottom <= _listView.ClientRectangle.Bottom;
+ }
+
+ public void EnableAutoScroll()
+ {
+ _autoScrollEnabled = true;
+ }
+
+ public void DisableAutoScroll()
+ {
+ _autoScrollEnabled = false;
+ }
+
+ private void AdjustColumnWidth()
+ {
+ if (_listView.Columns.Count > 0)
+ {
+ _listView.Columns[0].Width = _listView.ClientSize.Width;
+ }
+ }
+ }
+
+}
diff --git a/AppDiagnostic/LogFilter.cs b/AppDiagnostic/LogFilter.cs
new file mode 100644
index 000000000..6a8ec4f91
--- /dev/null
+++ b/AppDiagnostic/LogFilter.cs
@@ -0,0 +1,91 @@
+using SharedComponents;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace AppDiagnostic
+{
+ public class LogFilter
+ {
+ private ListView _listView;
+ private string _filterText = string.Empty; // Pre uloženie aktuálneho filtrovaného reťazca
+
+ // Konstruktor
+ public LogFilter(ListView listView)
+ {
+ _listView = listView;
+ }
+
+ // Metóda na aplikovanie filtra na ListView
+ public void ApplyFilter(string filterText)
+ {
+ _filterText = filterText.ToLower(); // Ukladáme text filtra bez ohľadu na veľkosť písmen
+
+ // Po aplikovaní filtra obnovíme zobrazenie
+ RefreshListView();
+ }
+
+ public void RefreshListView()
+ {
+ try
+ {
+ // Skontrolujeme, či sme na hlavnom vlákne a v prípade potreby použijeme Invoke
+ if (_listView.InvokeRequired)
+ {
+ // Použijeme Invoke, ak nie sme na hlavnom vlákne
+ _listView.Invoke(new Action(RefreshListView));
+ }
+ else
+ {
+ // Vymazanie existujúcich položiek
+ _listView.Items.Clear();
+
+ // Načítame všetky logy (ideálne z cache alebo databázy)
+ var logs = LiveLogCache.Instance.GetLogs(0, LiveLogCache.Instance.Logs.Count);
+
+ // Pridáme len tie logy, ktoré spĺňajú filter
+ foreach (var log in logs)
+ {
+ if (log.ToLower().Contains(_filterText)) // Kontrola, či log obsahuje filter text
+ {
+ var listViewItem = new ListViewItem(log);
+
+ // Striedanie farieb riadkov
+ if (_listView.Items.Count % 2 == 0) // Párny index => biela
+ {
+ listViewItem.BackColor = Color.White;
+ }
+ else // Nepárny index => svetlá sivá
+ {
+ listViewItem.BackColor = Color.FromArgb(240, 240, 240); // Veľmi svetlá sivá
+ }
+
+ // Pridanie efektu pre novú položku
+ ApplyNewItemEffect(listViewItem);
+
+ // Pridanie položky do ListView
+ _listView.Items.Add(listViewItem);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ // Zachytíme výnimku, ak sa niečo pokazí, a zobrazíme ju užívateľovi
+ MessageBox.Show($"An error occurred while refreshing the log view: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ // Môžete pridať ďalšie metódy na zobrazenie alebo efekt pre nové položky, ak je to potrebné
+ private void ApplyNewItemEffect(ListViewItem item)
+ {
+ // Prípadný efekt pre nový pridaný log
+ // Môžete pridať animáciu alebo zmenu farby atď.
+ item.ForeColor = Color.Green; // Napríklad zmeníme farbu písma na zelenú
+ }
+ }
+}
diff --git a/AppDiagnostic/MainForm.Designer.cs b/AppDiagnostic/MainForm.Designer.cs
new file mode 100644
index 000000000..1eef3958d
--- /dev/null
+++ b/AppDiagnostic/MainForm.Designer.cs
@@ -0,0 +1,278 @@
+using System.Windows.Forms;
+
+namespace AppDiagnostic
+{
+ partial class MainForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+ //private BufferedListView memoListView;
+ private System.Windows.Forms.ColumnHeader columnHeaderTime;
+ private System.Windows.Forms.ColumnHeader columnHeaderMessage;
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.columnHeaderTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.columnHeaderMessage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.refreshMemoButton = new System.Windows.Forms.Button();
+ this.button6 = new System.Windows.Forms.Button();
+ this.button7 = new System.Windows.Forms.Button();
+ this.filterManagementPanel = new System.Windows.Forms.Panel();
+ this.button5 = new System.Windows.Forms.Button();
+ this.filterButton = new System.Windows.Forms.Button();
+ this.filterTextBox = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.wndControlPanel = new System.Windows.Forms.Panel();
+ this.button2 = new System.Windows.Forms.Button();
+ this.flowControlsPanel = new System.Windows.Forms.Panel();
+ this.runButton = new System.Windows.Forms.Button();
+ this.stopButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.memoListView = new BufferedListView();
+ this.panel1.SuspendLayout();
+ this.filterManagementPanel.SuspendLayout();
+ this.wndControlPanel.SuspendLayout();
+ this.flowControlsPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // columnHeaderTime
+ //
+ this.columnHeaderTime.Text = "Time";
+ this.columnHeaderTime.Width = 150;
+ //
+ // columnHeaderMessage
+ //
+ this.columnHeaderMessage.Text = "Message";
+ this.columnHeaderMessage.Width = 350;
+ //
+ // panel1
+ //
+ this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.panel1.Controls.Add(this.refreshMemoButton);
+ this.panel1.Controls.Add(this.button6);
+ this.panel1.Controls.Add(this.button7);
+ this.panel1.Location = new System.Drawing.Point(189, 356);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(283, 26);
+ this.panel1.TabIndex = 16;
+ //
+ // refreshMemoButton
+ //
+ this.refreshMemoButton.Location = new System.Drawing.Point(108, 0);
+ this.refreshMemoButton.Name = "refreshMemoButton";
+ this.refreshMemoButton.Size = new System.Drawing.Size(84, 26);
+ this.refreshMemoButton.TabIndex = 17;
+ this.refreshMemoButton.Text = "Refresh memo";
+ this.refreshMemoButton.UseVisualStyleBackColor = true;
+ this.refreshMemoButton.Click += new System.EventHandler(this.refreshMemoButton_Click);
+ //
+ // button6
+ //
+ this.button6.Location = new System.Drawing.Point(0, 0);
+ this.button6.Name = "button6";
+ this.button6.Size = new System.Drawing.Size(102, 26);
+ this.button6.TabIndex = 4;
+ this.button6.Text = "Clean diag cache";
+ this.button6.UseVisualStyleBackColor = true;
+ this.button6.Click += new System.EventHandler(this.button6_Click);
+ //
+ // button7
+ //
+ this.button7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.button7.Location = new System.Drawing.Point(198, 0);
+ this.button7.Name = "button7";
+ this.button7.Size = new System.Drawing.Size(72, 26);
+ this.button7.TabIndex = 5;
+ this.button7.Text = "Save logs";
+ this.button7.UseVisualStyleBackColor = true;
+ this.button7.Click += new System.EventHandler(this.button7_Click);
+ //
+ // filterManagementPanel
+ //
+ this.filterManagementPanel.Controls.Add(this.button5);
+ this.filterManagementPanel.Controls.Add(this.filterButton);
+ this.filterManagementPanel.Controls.Add(this.filterTextBox);
+ this.filterManagementPanel.Controls.Add(this.label2);
+ this.filterManagementPanel.Location = new System.Drawing.Point(127, 6);
+ this.filterManagementPanel.Name = "filterManagementPanel";
+ this.filterManagementPanel.Size = new System.Drawing.Size(393, 26);
+ this.filterManagementPanel.TabIndex = 15;
+ //
+ // button5
+ //
+ this.button5.Enabled = false;
+ this.button5.Location = new System.Drawing.Point(294, 4);
+ this.button5.Name = "button5";
+ this.button5.Size = new System.Drawing.Size(81, 20);
+ this.button5.TabIndex = 11;
+ this.button5.Text = "Add new filter";
+ this.button5.UseVisualStyleBackColor = true;
+ //
+ // filterButton
+ //
+ this.filterButton.Location = new System.Drawing.Point(225, 4);
+ this.filterButton.Name = "filterButton";
+ this.filterButton.Size = new System.Drawing.Size(64, 20);
+ this.filterButton.TabIndex = 10;
+ this.filterButton.Text = "Set filter";
+ this.filterButton.UseVisualStyleBackColor = true;
+ this.filterButton.Click += new System.EventHandler(this.filterButton_Click_1);
+ //
+ // filterTextBox
+ //
+ this.filterTextBox.Location = new System.Drawing.Point(33, 4);
+ this.filterTextBox.Name = "filterTextBox";
+ this.filterTextBox.Size = new System.Drawing.Size(187, 20);
+ this.filterTextBox.TabIndex = 7;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(3, 8);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(29, 13);
+ this.label2.TabIndex = 6;
+ this.label2.Text = "Filter";
+ //
+ // wndControlPanel
+ //
+ this.wndControlPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.wndControlPanel.Controls.Add(this.button2);
+ this.wndControlPanel.Location = new System.Drawing.Point(831, 356);
+ this.wndControlPanel.Name = "wndControlPanel";
+ this.wndControlPanel.Size = new System.Drawing.Size(70, 26);
+ this.wndControlPanel.TabIndex = 14;
+ //
+ // button2
+ //
+ this.button2.Location = new System.Drawing.Point(3, 0);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(64, 26);
+ this.button2.TabIndex = 2;
+ this.button2.Text = "Close";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // flowControlsPanel
+ //
+ this.flowControlsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.flowControlsPanel.Controls.Add(this.runButton);
+ this.flowControlsPanel.Controls.Add(this.stopButton);
+ this.flowControlsPanel.Location = new System.Drawing.Point(12, 356);
+ this.flowControlsPanel.Name = "flowControlsPanel";
+ this.flowControlsPanel.Size = new System.Drawing.Size(133, 26);
+ this.flowControlsPanel.TabIndex = 13;
+ //
+ // runButton
+ //
+ this.runButton.Enabled = false;
+ this.runButton.Location = new System.Drawing.Point(0, 0);
+ this.runButton.Name = "runButton";
+ this.runButton.Size = new System.Drawing.Size(64, 26);
+ this.runButton.TabIndex = 4;
+ this.runButton.Text = "Run";
+ this.runButton.UseVisualStyleBackColor = true;
+ this.runButton.Click += new System.EventHandler(this.runButton_Click);
+ //
+ // stopButton
+ //
+ this.stopButton.Location = new System.Drawing.Point(69, 0);
+ this.stopButton.Name = "stopButton";
+ this.stopButton.Size = new System.Drawing.Size(64, 26);
+ this.stopButton.TabIndex = 5;
+ this.stopButton.Text = "Stop";
+ this.stopButton.UseVisualStyleBackColor = true;
+ this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 19);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(76, 13);
+ this.label1.TabIndex = 12;
+ this.label1.Text = "Flow of events";
+ //
+ // memoListView
+ //
+ this.memoListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.memoListView.FullRowSelect = true;
+ this.memoListView.GridLines = true;
+ this.memoListView.HideSelection = false;
+ this.memoListView.Location = new System.Drawing.Point(12, 38);
+ this.memoListView.Name = "memoListView";
+ this.memoListView.Size = new System.Drawing.Size(889, 312);
+ this.memoListView.TabIndex = 0;
+ this.memoListView.UseCompatibleStateImageBehavior = false;
+ this.memoListView.View = System.Windows.Forms.View.Details;
+
+ this.memoListView.DoubleClick += new System.EventHandler(this.MemoListView_DoubleClick);
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(913, 388);
+ this.Controls.Add(this.memoListView);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.filterManagementPanel);
+ this.Controls.Add(this.wndControlPanel);
+ this.Controls.Add(this.flowControlsPanel);
+ this.Controls.Add(this.label1);
+ this.Name = "MainForm";
+ this.Text = "Application live diagnostic";
+ this.panel1.ResumeLayout(false);
+ this.filterManagementPanel.ResumeLayout(false);
+ this.filterManagementPanel.PerformLayout();
+ this.wndControlPanel.ResumeLayout(false);
+ this.flowControlsPanel.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Button button6;
+ private System.Windows.Forms.Button button7;
+ private System.Windows.Forms.Panel filterManagementPanel;
+ private System.Windows.Forms.Button button5;
+ private System.Windows.Forms.Button filterButton;
+ private System.Windows.Forms.TextBox filterTextBox;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Panel wndControlPanel;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.Panel flowControlsPanel;
+ private System.Windows.Forms.Button runButton;
+ private System.Windows.Forms.Button stopButton;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button refreshMemoButton;
+ private BufferedListView memoListView;
+ }
+}
+
diff --git a/AppDiagnostic/MainForm.cs b/AppDiagnostic/MainForm.cs
new file mode 100644
index 000000000..ee4f6b817
--- /dev/null
+++ b/AppDiagnostic/MainForm.cs
@@ -0,0 +1,266 @@
+using log4net.Config;
+using log4net;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using log4net.Appender;
+using SharedComponents;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+using System.IO; // Pre File.WriteAllLines a prácu so súbormi
+using System.Linq;
+
+namespace AppDiagnostic
+{
+ public partial class MainForm : Form
+ {
+ private bool stopUpdate = false; // Premenná na zastavenie aktualizácie
+ private int lastDisplayedLogIndex = 0;
+ private bool autoScrollEnabled = true; // Automatický posun, predvolene povolený
+ private MainForm appDiagnosticForm;
+ private Timer refreshTimer;
+ private LogAdapter _logAdapter; // Pre LogAdapter
+ private LogFilter _logFilter; // LogFilter objekt pre filtráciu
+
+ public MainForm()
+ {
+ InitializeComponent();
+
+ // Inicializujeme LogAdapter a priradíme ho k memoListView
+ _logAdapter = new LogAdapter(memoListView);
+
+ RefreshLogView();
+
+ // Pripojenie na udalosť pri pridaní nového logu
+ // nakoľko sa memo refreshuje cyklicky, tak refresh na udalosť nepotrebujem
+ //LiveLogCache.Instance.LogAdded += OnLogAdded;
+
+ // Vytvoríme LogFilter objekt
+ //_logFilter = new LogFilter(memoListView);
+ }
+
+ private void OnLogAdded(string log)
+ {
+ try
+ {
+ RefreshLogView();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Error in OnLogAdded: {ex.Message}");
+ throw;
+ }
+ }
+
+ private void RefreshLogView()
+ {
+ // Skontrolujte, či voláme z iného vlákna
+ if (InvokeRequired)
+ {
+ Invoke((Action)RefreshLogView);
+ return;
+ }
+
+ memoListView.BeginUpdate(); // Zabraňuje vizuálnym aktualizáciám počas vykresľovania
+
+ try
+ {
+ // Skontrolujte, či je užívateľ na poslednom viditeľnom zázname
+ if (memoListView.Items.Count > 0)
+ {
+ var lastVisibleIndex = memoListView.TopItem.Index + memoListView.ClientRectangle.Height / memoListView.Items[0].Bounds.Height;
+ autoScrollEnabled = lastVisibleIndex >= memoListView.Items.Count - 1;
+ }
+
+ // Získajte nové logy od posledného indexu
+ var logs = LiveLogCache.Instance.GetLogs(lastDisplayedLogIndex, LiveLogCache.Instance.Logs.Count - lastDisplayedLogIndex);
+
+ // Pridajte len nové logy
+ foreach (var log in logs)
+ {
+ memoListView.Items.Add(new ListViewItem(log));
+ }
+
+ // Aktualizujte posledný zobrazený index
+ lastDisplayedLogIndex = LiveLogCache.Instance.Logs.Count;
+
+ // Ak je autoScrollEnabled, posuňte sa na posledný záznam
+ if (autoScrollEnabled && memoListView.Items.Count > 0)
+ {
+ memoListView.EnsureVisible(memoListView.Items.Count - 1);
+ }
+ }
+ finally
+ {
+ memoListView.EndUpdate(); // Umožní vizuálne aktualizácie
+ }
+ }
+
+ // Táto metóda sa spustí pri scrollovaní v memoListView (tzn. ak sa používateľ dostane na spodok listu)
+ private void memoListView_Scroll(object sender, EventArgs e)
+ {
+ // Skontrolujte, či používateľ dosiahol spodok ListView
+ if (memoListView.Items.Count > 0 &&
+ memoListView.Items[memoListView.Items.Count - 1].Bounds.Bottom <= memoListView.ClientSize.Height)
+ {
+ // Ak áno, načítame ďalšie logy
+ RefreshLogView();
+ }
+ }
+
+ private void button6_Click(object sender, EventArgs e)
+ {
+ //LiveLogCache.Instance.AddLog("Nový log z hlavnej aplikácie");
+
+ LiveLogCache.Instance.ClearLogs();
+ ClearListView();
+ }
+
+ private void runButton_Click(object sender, EventArgs e)
+ {
+ if (stopUpdate) // Ak je časovač zastavený, spustíme ho
+ {
+ stopUpdate = false; // Zastav aktualizáciu
+ runButton.Enabled = false; // Zakážeme tlačidlo Start počas behu
+ stopButton.Enabled = true; // Povolenie tlačidla Stop
+ refreshTimer.Start();
+ }
+ }
+
+ private void stopButton_Click(object sender, EventArgs e)
+ {
+ if (!stopUpdate) // Ak časovač beží, môžeme ho zastaviť
+ {
+ stopUpdate = true; // Spusti aktualizáciu
+ runButton.Enabled = true; // Povolenie tlačidla Start
+ stopButton.Enabled = false; // Zakážeme tlačidlo Stop
+ refreshTimer.Stop();
+ }
+ }
+
+ private void ClearListView()
+ {
+ if (InvokeRequired)
+ {
+ Invoke(new Action(ClearListView));
+ return;
+ }
+
+ memoListView.Items.Clear();
+ }
+
+ private void refreshMemoButton_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ private void button7_Click(object sender, EventArgs e)
+ {
+ SaveLogsToFile();
+ //LiveLogCache.Instance.AddLog("Toto je nový log.");
+ }
+
+ protected override void OnFormClosing(FormClosingEventArgs e)
+ {
+ // Odpojenie udalosti, keď sa okno zatvára, inak môže po opätovnom spustení okna a pridaní nového itemu do listu zhhodiť program
+ // nakoľko sa memo refreshuje cyklicky, tak refresh na udalosť nepotrebujem
+ //LiveLogCache.Instance.LogAdded -= OnLogAdded;
+
+ _logAdapter = null;
+
+ base.OnFormClosing(e);
+ }
+
+ private void filterButton_Click_1(object sender, EventArgs e)
+ {
+ // Aplikujeme filter na základe textu z filterTextBox
+ string filterText = filterTextBox.Text;
+ //_logFilter.ApplyFilter(filterText); // Aplikovanie filtra
+ _logAdapter.ApplyFilter(filterText);
+ }
+ private void SubForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ try
+ {
+ // Vaša logika pri uzatváraní formy
+ // this.Hide(); // Podforma sa len skryje
+ }
+ catch (Exception ex)
+ {
+ // Ošetrenie výnimky
+ MessageBox.Show("Chyba pri zatváraní pod-aplikácie: " + ex.Message);
+ }
+ }
+
+ private void SaveLogsToFile()
+ {
+ using (SaveFileDialog saveFileDialog = new SaveFileDialog())
+ {
+ saveFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
+ saveFileDialog.Title = "Save TBF live logs";
+ saveFileDialog.DefaultExt = "txt";
+ saveFileDialog.FileName = "TBFLiveLogs.txt";
+
+ if (saveFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ try
+ {
+ // Načítanie všetkých logov z LiveLogCache
+ var logs = LiveLogCache.Instance.GetLogs(0, LiveLogCache.Instance.GetCount());
+
+ // Uloženie logov do vybraného súboru
+ File.WriteAllLines(saveFileDialog.FileName, logs);
+
+ MessageBox.Show("Logs saved successfully.", "Save TBF live logs", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"An error occurred while saving TBF live logs: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ //this.Hide(); // Podforma sa len skryje
+ }
+
+ private void MemoListView_DoubleClick(object sender, EventArgs e)
+ {
+ if (memoListView.SelectedItems.Count > 0)
+ {
+ var selectedItem = memoListView.SelectedItems[0];
+ int selectedIndex = memoListView.Items.IndexOf(selectedItem);
+
+ if (selectedIndex >= 0)
+ {
+ // Zrušenie filtra
+ _logAdapter._filterText = string.Empty;
+
+ // Načítanie logov od indexu vybraného riadku
+ var logs = LiveLogCache.Instance.GetLogs(selectedIndex, LiveLogCache.Instance.GetCount() - selectedIndex);
+
+ // Obnovenie ListView s novými údajmi
+ memoListView.BeginUpdate();
+ memoListView.Items.Clear();
+ foreach (var log in logs)
+ {
+ var item = new ListViewItem(log)
+ {
+ BackColor = memoListView.Items.Count % 2 == 0 ? Color.White : Color.FromArgb(240, 240, 240)
+ };
+ memoListView.Items.Add(item);
+ }
+ memoListView.EndUpdate();
+ }
+ }
+ }
+ }
+}
diff --git a/AppDiagnostic/MainForm.resx b/AppDiagnostic/MainForm.resx
new file mode 100644
index 000000000..d58980a38
--- /dev/null
+++ b/AppDiagnostic/MainForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/AppDiagnostic/Program.cs b/AppDiagnostic/Program.cs
new file mode 100644
index 000000000..6aaa9c232
--- /dev/null
+++ b/AppDiagnostic/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace AppDiagnostic
+{
+ internal static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+ }
+ }
+}
diff --git a/AppDiagnostic/Properties/AssemblyInfo.cs b/AppDiagnostic/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..482abc00e
--- /dev/null
+++ b/AppDiagnostic/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("AppDiagnostic")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("AppDiagnostic")]
+[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fa9abad1-7184-4295-ade8-d44f2e3de6b2")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/AppDiagnostic/Properties/Resources.Designer.cs b/AppDiagnostic/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..1b5dfe715
--- /dev/null
+++ b/AppDiagnostic/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace AppDiagnostic.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AppDiagnostic.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/AppDiagnostic/Properties/Resources.resx b/AppDiagnostic/Properties/Resources.resx
new file mode 100644
index 000000000..13b775f1d
--- /dev/null
+++ b/AppDiagnostic/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/AppDiagnostic/Properties/Settings.Designer.cs b/AppDiagnostic/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..10069d35f
--- /dev/null
+++ b/AppDiagnostic/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace AppDiagnostic.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/AppDiagnostic/Properties/Settings.settings b/AppDiagnostic/Properties/Settings.settings
new file mode 100644
index 000000000..07e66beb1
--- /dev/null
+++ b/AppDiagnostic/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/AppDiagnostic/packages.config b/AppDiagnostic/packages.config
new file mode 100644
index 000000000..ffd035f93
--- /dev/null
+++ b/AppDiagnostic/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Config/Config.csproj b/Config/Config.csproj
index 630970d13..de72f1995 100644
--- a/Config/Config.csproj
+++ b/Config/Config.csproj
@@ -68,6 +68,7 @@
+
@@ -95,6 +96,7 @@
+
diff --git a/Config/Data.cs b/Config/Data.cs
new file mode 100644
index 000000000..88726d89d
--- /dev/null
+++ b/Config/Data.cs
@@ -0,0 +1,103 @@
+using System;
+
+//formulas.cs has been added cause iPerl from master-2 ...MF
+
+namespace Config
+{
+ public class Data
+ {
+ public const string AdminUsername = "admin";
+ public const string AdminPassword = "staratura";
+ public const string SQLiteDbFName = "SQLite.db";
+
+#if DN100 || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT || CEVAK_200
+ public const int WMsCount = 3;
+ public const int LineSize = 3;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = 1;
+#elif MUNICH
+ public const int WMsCount = 3;
+ public const int LineSize = 3;
+ public const int CompoundWMsCount = 3;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = 3;
+#elif MALTA_WSD25
+ public const int WMsCount = 6;
+ public const int LineSize = 6;
+ public const int CompoundWMsCount = 0;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = 1;
+#elif BADGER_MALA_TRAT || BERLIN || FUZHOU_150 || FUZHOU_300 || GELSENWASSER || GENESIS || IZRAEL_200 || PETERSBURG_200 || SENTEC || SLM_150 || TORINO_50
+ public const int WMsCount = 6;
+ public const int LineSize = 6;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = 1;
+#elif PUCHONG_200
+ public const int WMsCount = 6;
+ public const int LineSize = 6;
+ public const int CompoundWMsCount = 3;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = 3;
+#elif RUM_MOB
+ public const int WMsCount = 8;
+ public const int LineSize = 8;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif TURA_SPECIAL
+ public const int WMsCount = 6;
+ public const int LineSize = 6;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif DEWA_300 || FUZHOU_100 || ROMA_200 || LUXEMBURG_40
+ public const int WMsCount = 10;
+ public const int LineSize = 10;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif DUBAJ_50
+ public const int WMsCount = 10;
+ public const int LineSize = 5;
+ public const int CompoundWMsCount = 0;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif SLM_END || WARSAW_END
+ public const int WMsCount = 10;
+ public const int LineSize = 5;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = 4;
+#elif SLM_50
+ public const int WMsCount = 12;
+ public const int LineSize = 12;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 6;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif ALZIR_25 || BAHRAIN_50 || CEVAK_40 || FEWA_50 || FILIPINY_50 || FUZHOU_50 || HONGKONG_50 || IZRAEL_25 || JUZNA_AFRIKA_50 || KEMPNO_50 || KRAKOW_50 || MILWAUKEE || MURES_40 || PETERSBURG_50 || TORUN_50 || WARSAW_50 || ZAMBIA || ZODINO
+ public const int WMsCount = 20;
+ public const int LineSize = 10;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif TURA_IPERL || TURA_IPERL_NEW
+ public const int WMsCount = 40;
+ public const int LineSize = 20;
+ public const int CompoundWMsCount = 1;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#elif IZRAEL_50
+ public const int WMsCount = 40;
+ public const int LineSize = 10;
+ public const int CompoundWMsCount = 0;
+ public const int HeatMetersCount = 0;
+ public const int MaxPartNr = WMsCount / LineSize;
+#endif
+
+ public static double RealDensity = 0; /// true water density [kg/m3]
+ public static double AtTemperature = 0; /// measured at temperature [°C]
+ public static double Buoyancy = 0;
+ }
+}
diff --git a/Config/Entities/OutputPath.cs b/Config/Entities/OutputPath.cs
index 08280dbf0..c7a34bd31 100644
--- a/Config/Entities/OutputPath.cs
+++ b/Config/Entities/OutputPath.cs
@@ -18,8 +18,9 @@ namespace Config.Entities
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
public virtual string Selector { get; set; }
public virtual string RegValve { get; set; }
- public virtual string FlowMeter { get; set; }
- public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
+ public virtual int RegulMinStep { get; set; }
+ public virtual string FlowMeter { get; set; }
+ public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
public virtual string StartValve { get; set; }
public virtual string Diverter { get; set; }
public virtual string TempMtrDiv { get; set; }
@@ -39,6 +40,7 @@ namespace Config.Entities
{
ValvesOpen = string.Empty;
ValvesClose = string.Empty;
+ RegulMinStep = 0;
}
public OutputPath(string name, int itemNr)
@@ -46,7 +48,9 @@ namespace Config.Entities
{
Name = name;
ItemNr = itemNr;
- }
+ RegulMinStep = 0;
+
+ }
public virtual OutputPath Clone(string name, int itemNr)
{
@@ -58,7 +62,8 @@ namespace Config.Entities
result.FlowUnit = FlowUnit;
result.Selector = Selector;
result.RegValve = RegValve;
- result.FlowMeter = FlowMeter;
+ result.RegulMinStep = RegulMinStep;
+ result.FlowMeter = FlowMeter;
result.PidCoef = PidCoef;
result.StartValve = StartValve;
result.Diverter = Diverter;
diff --git a/Config/Formulas.cs b/Config/Formulas.cs
new file mode 100644
index 000000000..24b888476
--- /dev/null
+++ b/Config/Formulas.cs
@@ -0,0 +1,410 @@
+///
+/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using log4net;
+using Common;
+
+//formulas.cs has been added cause iPerl from master-2 ...MF
+
+namespace Config
+{
+ public static class Formulas
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(Formulas));
+
+
+ ///
+ /// Wrappers
+ ///
+ public static double RealDensity() { return Data.RealDensity; }
+ public static double AtTemperature() { return Data.AtTemperature; }
+ public static double Buoyancy() { return Data.Buoyancy; }
+
+
+ /// Private tables with coeficients to calculate specific enthalpy
+ static readonly int[] Ii;
+ static readonly int[] Ji;
+ static readonly double[] ni;
+
+ /// Private table with coeficients to calculate temperature of a platinum thermometer
+ static readonly double[] Di;
+
+
+ ///
+ /// Constructor
+ ///
+ static Formulas()
+ {
+ ///
+ /// Initialize tables to calculate specific enthalpies
+ ///
+ Ii = new int[34] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 };
+ Ji = new int[34] { -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 };
+ ni = new double[34] {
+ 0.14632971213167, /// 1
+ -0.84548187169114, /// 2
+ -0.37563603672040E1, /// 3
+ 0.33855169168385E1, /// 4
+ -0.95791963387872, /// 5
+ 0.15772038513228, /// 6
+ -0.16616417199501E-1, /// 7
+ 0.81214629983568E-3, /// 8
+ 0.28319080123804E-3, /// 9
+ -0.60706301565874E-3, /// 10
+ -0.18990068218419E-1, /// 11
+ -0.32529748770505E-1, /// 12
+ -0.21841717175414E-1, /// 13
+ -0.52838357969930E-4, /// 14
+ -0.47184321073267E-3, /// 15
+ -0.30001780793026E-3, /// 16
+ 0.47661393906987E-4, /// 17
+ -0.44141845330846E-5, /// 18
+ -0.72694996297594E-15, /// 19
+ -0.31679644845054E-4, /// 20
+ -0.28270797985312E-5, /// 21
+ -0.85205128120103E-9, /// 22
+ -0.22425281908000E-5, /// 23
+ -0.65171222895601E-6, /// 24
+ -0.14341729937924E-12, /// 25
+ -0.40516996860117E-6, /// 26
+ -0.12734301741641E-8, /// 27
+ -0.17424871230634E-9, /// 28
+ -0.68762131295531E-18, /// 29
+ 0.14478307828521E-19, /// 30
+ 0.26335781662795E-22, /// 31
+ -0.11947622640071E-22, /// 32
+ 0.18228094581404E-23, /// 33
+ -0.93537087292458E-25, /// 34
+ };
+
+ ///
+ /// Initialize a table to calculate temperature of a platinum thermometer from resistance
+ ///
+ Di = new double[]
+ {
+ 439.932854,
+ 472.418020,
+ 37.684494,
+ 7.472018,
+ 2.920828,
+ 0.005184,
+ -0.963864,
+ -0.188732,
+ 0.191203,
+ 0.049025,
+ };
+ }
+
+ ///
+ /// Calculate density of distilled water from temperature
+ ///
+ /// ITS-90 temperature in [°C]
+ /// Density in [kg/m3]
+ public static double DistilledWaterDensityFromTemp(double t)
+ {
+ if (t <= 40)
+ {
+ const double c0 = 999.839564;
+ const double c1 = 0.067998613;
+ const double c2 = -0.0091101468;
+ const double c3 = 0.00010058299;
+ const double c4 = -0.0000011275659;
+ const double c5 = 6.5985371e-09;
+
+ return ((((c5 * t + c4) * t + c3) * t + c2) * t + c1) * t + c0;
+ }
+ else
+ {
+ const double a0 = 9.9983952E2;
+ const double a1 = 1.6952577E1;
+ const double a2 = -7.9905127E-3;
+ const double a3 = -4.6241757E-5;
+ const double a4 = 1.0584601E-7;
+ const double a5 = -2.8103006E-10;
+ const double b = 1.6887236E-2;
+
+ return (((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0) / (1.0 + b * t);
+ }
+ }
+
+ ///
+ /// Calculate density of distilled water from temperature (obsolete)
+ ///
+ /// IPTS-68 temperature in [°C]
+ /// Density in [kg/m3]
+ public static double DistilledWaterDensityFromTempIPTS68(double t)
+ {
+ const double a0 = 999.842594;
+ const double a1 = 0.06793952;
+ const double a2 = -0.009095290;
+ const double a3 = 0.0001001685;
+ const double a4 = -0.000001120083;
+ const double a5 = 6.536332e-09;
+
+ return ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0;
+ }
+
+ ///
+ /// Calculate density by comparing calculated data and data from a certificate
+ ///
+ /// Density from a certificate in [kg/m3]
+ /// Temperature from a certificate in [°C]
+ /// Density correction in [kg/m3]
+ public static double DensityCorrection(double realDensity, double atTemperature)
+ {
+ /// Calculated data
+ double calculatedDensity = DistilledWaterDensityFromTemp(atTemperature);
+
+ return realDensity - calculatedDensity;
+ }
+
+ ///
+ /// Calculate corrected (real) water density from temperature
+ ///
+ /// Temperature in [°C]
+ /// Density in [kg/m3]
+ public static double WaterDensityFromTemp(double t)
+ {
+ return DistilledWaterDensityFromTemp(t) + DensityCorrection(RealDensity(), AtTemperature());
+ }
+
+ ///
+ /// Calculate corrected (real) water density from temperature
+ ///
+ /// Temperature in [°C]
+ /// Density in [kg/m3]
+ public static double WaterDensityFromTempPress(double temp, double pressure)
+ {
+ double x0 = 5.08821E-10;
+ double x1 = 1.2639418;
+ double x2 = 0.2660269;
+ double x3 = 0.3734838;
+ double x4 = 2.0205242;
+ double theta = temp / 100.0;
+ double B = x0 * (((x3 * theta + x2) * theta + x1) * theta + 1) / (1 + x4 * theta);
+
+ return WaterDensityFromTemp(temp) * (1 + B * Units.ConvertTo(Unit.Pa, pressure));
+ }
+
+
+ public static float AirDensityFromAmbientVales(float tempC, float pressureBar, float humiPct)
+ {
+ double pressurePa = 100000.0 * (double)pressureBar; /// [Pa]
+ double tempKelvin = 273.15 + (double)tempC;
+ double coef1 = 1.2811805 / 10000.0 * tempKelvin * tempKelvin
+ - 1.950987 / 100.0 * tempKelvin
+ + 34.04926034
+ - 6.353631 * 1000.0 / tempKelvin;
+ double coef3 = humiPct / 100.0 * System.Math.Exp(coef1) / pressurePa;
+ double airDensityKgm3 = 0.00348353 * pressurePa * (1.0 - 0.378 * coef3) / tempKelvin; /// kg/m3
+ return (float)airDensityKgm3;
+ }
+
+ ///
+ /// Convert 'pulses' to 'volume', prevent division by zero
+ ///
+ public static double VolumeFromPulses(int pulses, double pulsesPerLiter)
+ {
+ if (pulsesPerLiter <= double.Epsilon) return 0;
+ return Convert.ToDouble(pulses) / pulsesPerLiter;
+ }
+
+ ///
+ /// Calculate the error in % from 'measured' and 'true' volume, prevent division by zero
+ ///
+ public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
+ {
+ if (-float.Epsilon <= trueVolume && trueVolume <= float.Epsilon)
+ {
+ if (-float.Epsilon <= measuredVolume && measuredVolume <= float.Epsilon)
+ {
+ log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
+ return -100.0;
+ }
+
+ log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, 99.0);
+ return 99.0;
+ }
+
+ double error = 100.0 * (measuredVolume - trueVolume) / trueVolume;
+ log.InfoFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, error);
+ return error;
+ }
+
+
+ ///
+ /// Calculates corrected value from a list of corrections by interpolation.
+ /// It is assumed that values in the list 'corrections' are sorted.
+ ///
+ /// Raw uncorrected value
+ /// Sorted (value, correction) pairs
+ /// Corrected value
+ public static double CorrectedValue(double rawValue, IList corrections)
+ {
+ return rawValue + GetCorrection(rawValue, corrections);
+ }
+
+ ///
+ /// Get a correction from a list of corrections by interpolation.
+ /// It is assumed that values in the list 'corrections' are sorted.
+ ///
+ /// Raw uncorrected value
+ /// Sorted (value, correction) pairs
+ /// Corrected value
+ public static double GetCorrection(double rawValue, IList corrections)
+ {
+ if ((corrections == null) || (corrections.Count == 0)) return 0; /// No correction
+
+ if (rawValue < corrections[0].Measurement)
+ {
+ /// rawValue is below the lowest value in the correction table
+ return corrections[0].Correction;
+ }
+
+ int count = corrections.Count;
+ for (int i = 1; i < count; i++)
+ {
+ if (rawValue < corrections[i].Measurement)
+ {
+ double d1 = rawValue - corrections[i - 1].Measurement;
+ double d2 = corrections[i].Measurement - rawValue;
+
+ if (d1 + d2 <= float.Epsilon)
+ {
+ /// Neigboring values in the corection table are close to each other -> calculate the average
+ return (corrections[i - 1].Correction + corrections[i].Correction) / 2.0;
+ }
+ else
+ {
+ /// Interpolate the correction from neigboring values in the corection table
+ return (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2);
+ }
+ }
+ }
+
+ /// rawValue is above the highest value in the correction table
+ return corrections[count - 1].Correction;
+ }
+
+
+ ///
+ /// Converts a measurement error to a correction (used when preparing correction tables).
+ ///
+ /// Measured value (in arbitrary units)
+ /// Measurement error in %
+ /// Correction in the same units as the measured value
+ public static double CorrectionFromError(double measuredValue, double error)
+ {
+ double trueValue = measuredValue / (1 + error/100);
+ double correction = trueValue - measuredValue;
+ return correction;
+ }
+
+
+ ///
+ /// Calculates the heat coefficient for water
+ ///
+ /// Pressure [bar]
+ /// Inlet temperature [°C]
+ /// Outlet temperature [°C]
+ /// true = flow measured @inlet, false = flow measured @outlet
+ /// Heat coefficient for water [J/(m3 K)]
+ public static double HeatCoefficientWater(double pressure, double T_in, double T_out, bool flowMeasuredAtInlet)
+ {
+ if (T_in == T_out) return 0;
+
+ const double R = 461.526; /// [J kg^-1 K^-1]
+ const double p_star_Pa = 16.53E6; /// [Pa] (=16.53 MPa)
+ const double T_star = 1386.0; /// [K]
+
+ double T_in_K = Units.ConvertTo(Unit.K, T_in);
+ double T_out_K = Units.ConvertTo(Unit.K, T_out);
+ double tau_in = T_star / T_in_K;
+ double tau_out = T_star / T_out_K;
+ double pi = Units.ConvertTo(Unit.Pa, pressure) / p_star_Pa;
+
+ double h_in = tau_in * GammaTau(pi, tau_in) * R * T_in_K;
+ double h_out = tau_out * GammaTau(pi, tau_out) * R * T_out_K;
+
+ double ni = flowMeasuredAtInlet ? GammaPi(pi, tau_in) * R * T_in_K / p_star_Pa
+ : GammaPi(pi, tau_out) * R * T_out_K / p_star_Pa;
+
+ return (h_in - h_out) / (ni * (T_in - T_out));
+ }
+
+ ///
+ /// gamma(pi) see also STN EN 1434-1 Annex A (A.4)
+ ///
+ /// pi = p / p* where p* = 16.53 MPa
+ /// tau = T* / T where T* = 1386 K
+ /// gamma(pi)
+ static double GammaPi(double pi, double tau)
+ {
+ double result = 0;
+ for (int i = 0; i < 34; i++)
+ {
+ result -= ni[i] * Ii[i] * Math.Pow(7.1 - pi, Ii[i] - 1) * Math.Pow(tau - 1.222, Ji[i]);
+ }
+ return result;
+ }
+
+ ///
+ /// gamma(tau) see also STN EN 1434-1 Annex A (A.7)
+ ///
+ /// pi = p / p* where p* = 16.53 MPa
+ /// tau = T* / T where T* = 1386 K
+ /// gamma(tau)
+ static double GammaTau(double pi, double tau)
+ {
+ double result = 0;
+ for (int i = 0; i < 34; i++)
+ {
+ result += ni[i] * Math.Pow(7.1 - pi, Ii[i]) * Ji[i] * Math.Pow(tau - 1.222, Ji[i] - 1);
+ }
+ return result;
+ }
+
+ ///
+ /// Conversion of measured resistance of a platinum thermometer to temperature according to ITS-90
+ ///
+ /// Measured resistance in [°C]
+ /// Calibrated resistance in Ohm at 0.01°C
+ /// Calibrated ITS-90 coefficient a7
+ /// Calibrated ITS-90 coefficient b7
+ /// Calibrated ITS-90 coefficient c7
+ /// Temperature in [°C]
+ public static double PlatinumResistanceTM_ITS90_R2T(double R, double R001C, double a7, double b7, double c7)
+ {
+ double w = R / R001C; /// ratio
+ double r1 = w - 1.0;
+ double dw = r1 * (a7 + r1 * (b7 + r1 * c7)); /// = a7*r1 + b7*r1^2 + c7*r1^3
+ double wr = w - dw;
+ double x = (wr - 2.64) / 1.64;
+
+ double sum = 0;
+ for (int i = Di.Length - 1; i >= 0; i--)
+ {
+ sum = sum * x + Di[i];
+ }
+
+ return sum;
+ }
+
+ ///
+ /// Conversion of measured resistance of a platinum thermometer to temperature using Callendar-Van Dusen equations
+ ///
+ /// Measured resistance in [°C]
+ /// Calibrated resistance in Ohm at 0°C
+ /// Calibration coefficient a
+ /// Calibration coefficient b
+ /// Temperature in [°C]
+ public static double PlatinumResistanceTM_ITS27_R2T(double R, double R0, double A, double B)
+ {
+ if (R0 * R0 * A * A - 4 * R0 * B * (R0 - R) <= 0) return 0; /// Out of range
+
+ return (-(R0 * A) + Math.Sqrt(R0 * R0 * A * A - 4 * R0 * B * (R0 - R))) / (2 * R0 * B);
+ }
+ }
+}
diff --git a/Config/Mappings/OutputPathMap.cs b/Config/Mappings/OutputPathMap.cs
index 4f15ea422..7ec08d439 100644
--- a/Config/Mappings/OutputPathMap.cs
+++ b/Config/Mappings/OutputPathMap.cs
@@ -17,7 +17,8 @@ namespace Config.Mappings
Map(x => x.Qto);
Map(x => x.Selector);
Map(x => x.RegValve);
- Map(x => x.FlowMeter);
+ Map(x => x.RegulMinStep);
+ Map(x => x.FlowMeter);
Map(x => x.PidCoef);
Map(x => x.StartValve);
Map(x => x.Diverter);
diff --git a/Results/Entities/MeterTestRslt.cs b/Results/Entities/MeterTestRslt.cs
index 1834e000e..92a463fbb 100644
--- a/Results/Entities/MeterTestRslt.cs
+++ b/Results/Entities/MeterTestRslt.cs
@@ -29,8 +29,12 @@ namespace Results.Entities
public virtual long ErrorIndicators { get; set; } /// Not mapped to DB !!!, bit24=E25, bit25=E26, bit26=E27, bit27=E28 (error flags)
public virtual long InfoIndicators { get; set; } /// Not mapped to DB !!!, bit24=E25, bit25=E26, bit26=E27, bit27=E28 (info flags)
public virtual bool TestDone { get; set; } /// true = test was completed
- public virtual bool Passed { get; set; } /// true = test passed, water meter is OK
+ public virtual bool Passed { get; set; } /// true = test passed, water meter is OK
#if IPERL
+ public virtual int CalibFactor { get; set; }
+ public virtual int CalibFactorLNA { get; set; }
+ public virtual int Q2CorrRL { get; set; }
+ public virtual int Q2CorrLR { get; set; }
public virtual string ExtraDataPath { get; set; } /// Relative path to a file with opto-data/raw-data
public virtual float X1 { get; set; }
public virtual float X2 { get; set; }
@@ -166,6 +170,10 @@ namespace Results.Entities
TestDone = src.TestDone;
Passed = src.Passed;
#if IPERL
+ CalibFactor = src.CalibFactor;
+ CalibFactorLNA = src.CalibFactorLNA;
+ Q2CorrRL = src.Q2CorrRL;
+ Q2CorrLR = src.Q2CorrLR;
ExtraDataPath = src.ExtraDataPath;
X1 = src.X1;
X2 = src.X2;
@@ -209,6 +217,10 @@ namespace Results.Entities
writer.Write(TestDone);
writer.Write(Passed);
#if IPERL
+ writer.Write(CalibFactor);
+ writer.Write(CalibFactorLNA);
+ writer.Write(Q2CorrRL);
+ writer.Write(Q2CorrLR);
writer.Write((ExtraDataPath != null) ? ExtraDataPath : string.Empty);
writer.Write(X1);
writer.Write(X2);
@@ -249,6 +261,10 @@ namespace Results.Entities
TestDone = reader.ReadBoolean();
Passed = reader.ReadBoolean();
#if IPERL
+ CalibFactor = reader.ReadInt32();
+ CalibFactorLNA = reader.ReadInt32();
+ Q2CorrRL = reader.ReadInt32();
+ Q2CorrLR = reader.ReadInt32();
ExtraDataPath = reader.ReadString();
X1 = reader.ReadSingle();
X2 = reader.ReadSingle();
diff --git a/Results/Results.csproj b/Results/Results.csproj
index 3baa75d44..65fbd6be1 100644
--- a/Results/Results.csproj
+++ b/Results/Results.csproj
@@ -29,7 +29,7 @@
pdbonly
true
bin\Release\
- TRACE
+ TRACE;IPERL
prompt
4
false
@@ -241,7 +241,9 @@
-
+
+ Designer
+
ResXFileCodeGenerator
Strings.Designer.cs
diff --git a/SchematicDrawing/DrawingShape.cs b/SchematicDrawing/DrawingShape.cs
index 959993d30..fb4945a47 100644
--- a/SchematicDrawing/DrawingShape.cs
+++ b/SchematicDrawing/DrawingShape.cs
@@ -378,6 +378,40 @@ namespace SchematicDrawing
Properties.Resources.Valve_XL_closed,
Properties.Resources.Valve_XL_vacuum,
Properties.Resources.Valve_XL_open_dry);
+ /// ValveSw
+ Shapes[DrShIx(Shape.ValveSw, Sz.S)] = new DrawingShape(Shape.ValveSw, Sz.S, 2, 2,
+ new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) },
+ new Edge[] { new Edge(0, 1, 20, RouteCouple.OpenWhen1), new Edge(1, 0, 20, RouteCouple.OpenWhen1) },
+ 0, 0, 20, 20,
+ Properties.Resources.ValveSw_S_open,
+ Properties.Resources.ValveSw_S_closed,
+ Properties.Resources.ValveSw_S_vacuum,
+ Properties.Resources.ValveSw_S_open_dry);
+ Shapes[DrShIx(Shape.ValveSw, Sz.M)] = new DrawingShape(Shape.ValveSw, Sz.M, 3, 4,
+ new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) },
+ new Edge[] { new Edge(0, 1, 30, RouteCouple.OpenWhen1), new Edge(1, 0, 30, RouteCouple.OpenWhen1) },
+ 0, 5, 30, 30,
+ Properties.Resources.ValveSw_M_open,
+ Properties.Resources.ValveSw_M_closed,
+ Properties.Resources.ValveSw_M_vacuum,
+ Properties.Resources.ValveSw_M_open_dry);
+ Shapes[DrShIx(Shape.ValveSw, Sz.L)] = new DrawingShape(Shape.ValveSw, Sz.L, 4, 4,
+ new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) },
+ new Edge[] { new Edge(0, 1, 40, RouteCouple.OpenWhen1), new Edge(1, 0, 40, RouteCouple.OpenWhen1) },
+ 0, 0, 40, 40,
+ Properties.Resources.ValveSw_L_open,
+ Properties.Resources.ValveSw_L_closed,
+ Properties.Resources.ValveSw_L_vacuum,
+ Properties.Resources.ValveSw_L_open_dry);
+ Shapes[DrShIx(Shape.ValveSw, Sz.XL)] = new DrawingShape(Shape.ValveSw, Sz.XL, 5, 6,
+ new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) },
+ new Edge[] { new Edge(0, 1, 50, RouteCouple.OpenWhen1), new Edge(1, 0, 50, RouteCouple.OpenWhen1) },
+ 0, 5, 50, 50,
+ Properties.Resources.ValveSw_XL_open,
+ Properties.Resources.ValveSw_XL_closed,
+ Properties.Resources.ValveSw_XL_vacuum,
+ Properties.Resources.ValveSw_XL_open_dry);
+
/// Diverter
Shapes[DrShIx(Shape.Div, Sz.S)] = new DrawingShape(Shape.Div, Sz.S, 2, 2,
new Node[] { new Node(2, 0, Orient.Up), new Node(1, 2, Orient.Dn), new Node(3, 2, Orient.Dn) },
@@ -523,12 +557,18 @@ namespace SchematicDrawing
Shapes[DrShIx(Shape.Scale, Sz.L)] = new DrawingShape(Shape.Scale, Sz.L, 12, 11, new Node[] { new Node(6, 11, Orient.Dn) }, null, 0, 0, 120, 110, Properties.Resources.Scale_L);
Shapes[DrShIx(Shape.Scale, Sz.XL)] = new DrawingShape(Shape.Scale, Sz.XL, 16, 13, new Node[] { new Node(8, 13, Orient.Dn) }, null, 0, 0, 160, 130, Properties.Resources.Scale_XL);
- /// Tank
+ /// Tank uni
Shapes[DrShIx(Shape.Tank, Sz.S)] = new DrawingShape(Shape.Tank, Sz.S, 10, 8, new Node[] { new Node(0, 6, Orient.L) }, null, 0, 0, 100, 80, Properties.Resources.Tank_S);
Shapes[DrShIx(Shape.Tank, Sz.M)] = new DrawingShape(Shape.Tank, Sz.M, 12, 9, new Node[] { new Node(0, 7, Orient.L) }, null, 0, 0, 120, 90, Properties.Resources.Tank_M);
Shapes[DrShIx(Shape.Tank, Sz.L)] = new DrawingShape(Shape.Tank, Sz.L, 15, 11, new Node[] { new Node(0, 9, Orient.L) }, null, 0, 0, 150, 110, Properties.Resources.Tank_L);
Shapes[DrShIx(Shape.Tank, Sz.XL)] = new DrawingShape(Shape.Tank, Sz.XL, 20, 13, new Node[] { new Node(0, 11, Orient.L) }, null, 0, 0, 200, 130, Properties.Resources.Tank_XL);
+ /// Tank hot
+ Shapes[DrShIx(Shape.TankHot, Sz.S)] = new DrawingShape(Shape.TankHot, Sz.S, 10, 8, new Node[] { new Node(0, 6, Orient.L) }, null, 0, 0, 100, 80, Properties.Resources.Tank_S_hot);
+ Shapes[DrShIx(Shape.TankHot, Sz.M)] = new DrawingShape(Shape.TankHot, Sz.M, 12, 9, new Node[] { new Node(0, 7, Orient.L) }, null, 0, 0, 120, 90, Properties.Resources.Tank_M_hot);
+ Shapes[DrShIx(Shape.TankHot, Sz.L)] = new DrawingShape(Shape.TankHot, Sz.L, 15, 11, new Node[] { new Node(0, 9, Orient.L) }, null, 0, 0, 150, 110, Properties.Resources.Tank_L_hot);
+ Shapes[DrShIx(Shape.TankHot, Sz.XL)] = new DrawingShape(Shape.TankHot, Sz.XL, 20, 13, new Node[] { new Node(0, 11, Orient.L) }, null, 0, 0, 200, 130, Properties.Resources.Tank_XL_hot);
+
/// Junction
Shapes[DrShIx(Shape.Junction, Sz.None)] = new DrawingShape(Shape.Junction, Sz.None, 0, 0, new Node[] { new Node(0, 0, Orient.R) });
Shapes[DrShIx(Shape.Junction, Sz.S)] = new DrawingShape(Shape.Junction, Sz.S, 2, 2,
diff --git a/SchematicDrawing/Enums.cs b/SchematicDrawing/Enums.cs
index 6bf0d6771..6ed27eeb8 100644
--- a/SchematicDrawing/Enums.cs
+++ b/SchematicDrawing/Enums.cs
@@ -45,11 +45,13 @@ namespace SchematicDrawing
Scale,
Sink,
Tank,
+ TankHot,
Tee,
TempM,
UniCB,
Vacuum,
Valve,
+ ValveSw,
WaterM,
ElectricM,
diff --git a/SchematicDrawing/Pictures/Tank-L-hot.png b/SchematicDrawing/Pictures/Tank-L-hot.png
new file mode 100644
index 000000000..fddf1604b
Binary files /dev/null and b/SchematicDrawing/Pictures/Tank-L-hot.png differ
diff --git a/SchematicDrawing/Pictures/Tank-M-hot.png b/SchematicDrawing/Pictures/Tank-M-hot.png
new file mode 100644
index 000000000..40121259a
Binary files /dev/null and b/SchematicDrawing/Pictures/Tank-M-hot.png differ
diff --git a/SchematicDrawing/Pictures/Tank-S-hot.png b/SchematicDrawing/Pictures/Tank-S-hot.png
new file mode 100644
index 000000000..4e052e67c
Binary files /dev/null and b/SchematicDrawing/Pictures/Tank-S-hot.png differ
diff --git a/SchematicDrawing/Pictures/Tank-XL-hot.png b/SchematicDrawing/Pictures/Tank-XL-hot.png
new file mode 100644
index 000000000..34cb418d3
Binary files /dev/null and b/SchematicDrawing/Pictures/Tank-XL-hot.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-L-closed.png b/SchematicDrawing/Pictures/ValveSw-L-closed.png
new file mode 100644
index 000000000..052aed4ee
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-L-closed.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-L-open-dry.png b/SchematicDrawing/Pictures/ValveSw-L-open-dry.png
new file mode 100644
index 000000000..86d355d00
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-L-open-dry.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-L-open.png b/SchematicDrawing/Pictures/ValveSw-L-open.png
new file mode 100644
index 000000000..0bf26b0fd
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-L-open.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-L-vacuum.png b/SchematicDrawing/Pictures/ValveSw-L-vacuum.png
new file mode 100644
index 000000000..ffda1b101
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-L-vacuum.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-M-closed.png b/SchematicDrawing/Pictures/ValveSw-M-closed.png
new file mode 100644
index 000000000..297d65bde
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-M-closed.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-M-open-dry.png b/SchematicDrawing/Pictures/ValveSw-M-open-dry.png
new file mode 100644
index 000000000..532644076
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-M-open-dry.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-M-open.png b/SchematicDrawing/Pictures/ValveSw-M-open.png
new file mode 100644
index 000000000..58c10ba47
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-M-open.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-M-vacuum.png b/SchematicDrawing/Pictures/ValveSw-M-vacuum.png
new file mode 100644
index 000000000..c13dda053
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-M-vacuum.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-S-closed.png b/SchematicDrawing/Pictures/ValveSw-S-closed.png
new file mode 100644
index 000000000..7278a215a
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-S-closed.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-S-open-dry.png b/SchematicDrawing/Pictures/ValveSw-S-open-dry.png
new file mode 100644
index 000000000..d54ad96da
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-S-open-dry.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-S-open.png b/SchematicDrawing/Pictures/ValveSw-S-open.png
new file mode 100644
index 000000000..0f0dbd371
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-S-open.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-S-vacuum.png b/SchematicDrawing/Pictures/ValveSw-S-vacuum.png
new file mode 100644
index 000000000..5dbc7edee
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-S-vacuum.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-XL-closed.png b/SchematicDrawing/Pictures/ValveSw-XL-closed.png
new file mode 100644
index 000000000..bf00b396e
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-XL-closed.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-XL-open-dry.png b/SchematicDrawing/Pictures/ValveSw-XL-open-dry.png
new file mode 100644
index 000000000..653a59064
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-XL-open-dry.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-XL-open.png b/SchematicDrawing/Pictures/ValveSw-XL-open.png
new file mode 100644
index 000000000..937f352be
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-XL-open.png differ
diff --git a/SchematicDrawing/Pictures/ValveSw-XL-vacuum.png b/SchematicDrawing/Pictures/ValveSw-XL-vacuum.png
new file mode 100644
index 000000000..96674b408
Binary files /dev/null and b/SchematicDrawing/Pictures/ValveSw-XL-vacuum.png differ
diff --git a/SchematicDrawing/Properties/Resources.Designer.cs b/SchematicDrawing/Properties/Resources.Designer.cs
index fad9b2f68..dd8d82bef 100644
--- a/SchematicDrawing/Properties/Resources.Designer.cs
+++ b/SchematicDrawing/Properties/Resources.Designer.cs
@@ -19,7 +19,7 @@ namespace SchematicDrawing.Properties {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@@ -730,6 +730,16 @@ namespace SchematicDrawing.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Tank_L_hot {
+ get {
+ object obj = ResourceManager.GetObject("Tank_L_hot", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
@@ -740,6 +750,16 @@ namespace SchematicDrawing.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Tank_M_hot {
+ get {
+ object obj = ResourceManager.GetObject("Tank_M_hot", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
@@ -750,6 +770,16 @@ namespace SchematicDrawing.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Tank_S_hot {
+ get {
+ object obj = ResourceManager.GetObject("Tank_S_hot", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
@@ -760,6 +790,16 @@ namespace SchematicDrawing.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Tank_XL_hot {
+ get {
+ object obj = ResourceManager.GetObject("Tank_XL_hot", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
@@ -970,6 +1010,166 @@ namespace SchematicDrawing.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_L_closed {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_L_closed", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_L_open {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_L_open", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_L_open_dry {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_L_open_dry", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_L_vacuum {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_L_vacuum", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_M_closed {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_M_closed", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_M_open {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_M_open", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_M_open_dry {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_M_open_dry", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_M_vacuum {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_M_vacuum", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_S_closed {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_S_closed", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_S_open {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_S_open", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_S_open_dry {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_S_open_dry", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_S_vacuum {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_S_vacuum", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_XL_closed {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_XL_closed", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_XL_open {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_XL_open", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_XL_open_dry {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_XL_open_dry", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ValveSw_XL_vacuum {
+ get {
+ object obj = ResourceManager.GetObject("ValveSw_XL_vacuum", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
diff --git a/SchematicDrawing/Properties/Resources.resx b/SchematicDrawing/Properties/Resources.resx
index 2546e19f8..2c0c89b9c 100644
--- a/SchematicDrawing/Properties/Resources.resx
+++ b/SchematicDrawing/Properties/Resources.resx
@@ -319,6 +319,18 @@
..\Pictures\Tank-XL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Pictures\Tank-L-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\Tank-M-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\Tank-S-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\Tank-XL-hot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Pictures\Vacuum-L-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -373,7 +385,66 @@
..\Pictures\Valve-XL-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
+
+
+
+
+
+
+ ..\Pictures\ValveSw-L-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-L-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-L-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-L-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-M-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-M-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-M-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-M-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-S-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-S-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-S-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-S-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-XL-closed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-XL-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-XL-open-dry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Pictures\ValveSw-XL-vacuum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+
+
+
+
+
+
..\Pictures\WaterM-L.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
diff --git a/SchematicDrawing/SchematicDrawing.csproj b/SchematicDrawing/SchematicDrawing.csproj
index 1fe79deb8..c438c5178 100644
--- a/SchematicDrawing/SchematicDrawing.csproj
+++ b/SchematicDrawing/SchematicDrawing.csproj
@@ -98,6 +98,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -118,6 +128,10 @@
+
+
+
+
@@ -187,6 +201,12 @@
+
+
+
+
+
+
diff --git a/SchematicDrawing/SchematicDrawingCtrl.cs b/SchematicDrawing/SchematicDrawingCtrl.cs
index f21cf4f59..5c6c4eb66 100644
--- a/SchematicDrawing/SchematicDrawingCtrl.cs
+++ b/SchematicDrawing/SchematicDrawingCtrl.cs
@@ -365,7 +365,7 @@ namespace SchematicDrawing
{
GNode gnode = new GNode(item, nid);
item.GNodes.Add(gnode);
- graph.AddNode(gnode, dshape.Shape == Shape.Tank, dshape.Shape == Shape.Scale);
+ graph.AddNode(gnode, dshape.Shape == Shape.Tank || dshape.Shape == Shape.TankHot, dshape.Shape == Shape.Scale);
}
foreach (var edge in dshape.Edges)
@@ -864,7 +864,7 @@ namespace SchematicDrawing
/// Draw the component image
Rectangle rect = dsh.GetRotatedFlippedImageRectangle(item);
- if (item is IRouteBasedDrawingItem && routeBit == false /// closed
+ if (item is IRouteBasedDrawingItem && routeBit == false /// closed
&& item.GNodes.Count > 0 && item.GNodes[0].Dist < Const.Vacuum /// wet
&& dsh.HasClosedWet) /// has appropriate image
{
diff --git a/SharedComponents/LiveLogCache.cs b/SharedComponents/LiveLogCache.cs
new file mode 100644
index 000000000..656974152
--- /dev/null
+++ b/SharedComponents/LiveLogCache.cs
@@ -0,0 +1,234 @@
+using System.IO.MemoryMappedFiles;
+using System.Text;
+
+namespace SharedComponents
+{
+ public class LiveLogCache
+ {
+ /*// Staticka instancia pre singleton
+ private static readonly LiveLogCache _instance = new LiveLogCache();
+
+ // Uzamykaci objekt pre bezpecny pristup z viacerych vlakien
+ private static readonly object _lock = new object();
+
+ // Zoznam na ukladanie logov
+ private readonly List _logs = new List();
+
+ // Udalost pre notifikaciu pri zmene logov
+ public event Action LogAdded;
+
+ // Sukromny konstruktor (singleton pattern)
+ private LiveLogCache() { }
+
+ // Metoda na ziskanie poctu logov
+ public int GetCount()
+ {
+ return _logs.Count;
+ }
+
+ // Staticka metoda na ziskanie instancie
+ public static LiveLogCache Instance
+ {
+ get
+ {
+ lock (_lock)
+ {
+ return _instance;
+ }
+ }
+ }
+
+ // Verejna vlastnost na ziskanie logov
+ public IReadOnlyList Logs
+ {
+ get
+ {
+ lock (_lock)
+ {
+ return _logs.AsReadOnly();
+ }
+ }
+ }
+
+ // Metoda na pridanie logu
+ public void AddLog(string log)
+ {
+ // Ziskanie aktualneho casu v pozadovanom formate
+ string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:");
+
+ // Vytvorenie noveho logu s casovou peciatkou na zaciatku
+ string logWithTimeStamp = $"{timeStamp} {log}";
+
+ // Pridanie logu do zoznamu
+ lock (_lock)
+ {
+ _logs.Add(logWithTimeStamp);
+ }
+
+ // Spustenie udalosti pre notifikaciu
+ LogAdded?.Invoke(logWithTimeStamp);
+ }
+
+ // Metoda na vycistenie logov
+ public void ClearLogs()
+ {
+ lock (_lock)
+ {
+ _logs.Clear();
+ }
+
+ // Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov
+ LogAdded?.Invoke("Logs were cleared.");
+ }
+
+ // Ziskanie vsetkych logov
+ public List GetAllLogs()
+ {
+ return new List(_logs); // Vratime kopiu logov
+ }
+
+ // Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim)
+ public List GetLogs(int startIndex, int count)
+ {
+ // Zabezpeci, ze indexy nebudu mimo rozsahu
+ return _logs.Skip(startIndex).Take(count).ToList();
+ }*/
+
+ // Zlepseny kod, ktory umoznuje pracu s MemoryMappedFile, namiesto len priestoru vo virtualnej pamati, navyse je tento subor velkostne obmedzeny na 1MB
+
+ // Staticka instancia pre singleton
+ private static readonly LiveLogCache _instance = new LiveLogCache(true);
+
+ // Uzamykaci objekt pre bezpecny pristup z viacerych vlakien
+ private static readonly object _lock = new object();
+
+ // Zoznam na ukladanie logov
+ private readonly List _logs = new List();
+
+ // Udalost pre notifikaciu pri zmene logov
+ public event Action LogAdded;
+
+ // Memory-mapped file
+ private MemoryMappedFile _mmf;
+ private MemoryMappedViewAccessor _accessor;
+ private const int MaxLogSize = 1024 * 1024; // 1MB
+
+ // Sukromny konstruktor (singleton pattern)
+ private LiveLogCache(bool itsLogsCreator)
+ {
+ if (itsLogsCreator == true)
+ {
+ _mmf = MemoryMappedFile.CreateOrOpen("LiveLogCacheMMF", MaxLogSize);
+ }
+ else
+ {
+ _mmf = MemoryMappedFile.OpenExisting("LiveLogCacheMMF");
+ }
+
+ _accessor = _mmf.CreateViewAccessor();
+ }
+
+ // Metoda na ziskanie poctu logov
+ public int GetCount()
+ {
+ return _logs.Count;
+ }
+
+ // Staticka metoda na ziskanie instancie
+ public static LiveLogCache Instance
+ {
+ get
+ {
+ lock (_lock)
+ {
+ return _instance;
+ }
+ }
+ }
+
+ // Verejna vlastnost na ziskanie logov
+ public IReadOnlyList Logs
+ {
+ get
+ {
+ lock (_lock)
+ {
+ return _logs.AsReadOnly();
+ }
+ }
+ }
+
+ // Metoda na pridanie logu
+ public void AddLog(string log)
+ {
+ // Ziskanie aktualneho casu v pozadovanom formate
+ string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:");
+
+ // Vytvorenie noveho logu s casovou peciatkou na zaciatku
+ string logWithTimeStamp = $"{timeStamp} {log}";
+
+ // Pridanie logu do zoznamu
+ lock (_lock)
+ {
+ _logs.Add(logWithTimeStamp);
+ WriteLogToMemoryMappedFile(logWithTimeStamp);
+ }
+
+ // Spustenie udalosti pre notifikaciu
+ LogAdded?.Invoke(logWithTimeStamp);
+ }
+
+ // Metoda na vycistenie logov
+ public void ClearLogs()
+ {
+ lock (_lock)
+ {
+ _logs.Clear();
+ ClearMemoryMappedFile();
+ }
+
+ // Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov
+ LogAdded?.Invoke("Logs were cleared.");
+ }
+
+ // Ziskanie vsetkych logov
+ public List GetAllLogs()
+ {
+ return new List(_logs); // Vratime kopiu logov
+ }
+
+ // Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim)
+ public List GetLogs(int startIndex, int count)
+ {
+ // Zabezpeci, ze indexy nebudu mimo rozsahu
+ return _logs.Skip(startIndex).Take(count).ToList();
+ }
+
+ // Metoda na naplnenie ListView
+ /*public void PopulateListView(ListView listView)
+ {
+ listView.Items.Clear();
+ lock (_lock)
+ {
+ foreach (var log in _logs)
+ {
+ listView.Items.Add(new ListView Item(log));
+ }
+ }
+ }*/
+
+ // Write log to memory-mapped file
+ private void WriteLogToMemoryMappedFile(string log)
+ {
+ byte[] logBytes = Encoding.UTF8.GetBytes(log + Environment.NewLine);
+ _accessor.WriteArray(0, logBytes, 0, logBytes.Length);
+ }
+
+ // Clear memory-mapped file
+ private void ClearMemoryMappedFile()
+ {
+ byte[] emptyBytes = new byte[MaxLogSize];
+ _accessor.WriteArray(0, emptyBytes, 0, emptyBytes.Length);
+ }
+ }
+}
diff --git a/SharedComponents/SharedComponents.csproj b/SharedComponents/SharedComponents.csproj
new file mode 100644
index 000000000..06e92ea43
--- /dev/null
+++ b/SharedComponents/SharedComponents.csproj
@@ -0,0 +1,10 @@
+
+
+
+ net472
+ 10.0
+ enable
+ enable
+
+
+
diff --git a/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig b/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 000000000..a02128ff9
--- /dev/null
+++ b/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,5 @@
+is_global = true
+build_property.RootNamespace = SharedComponents
+build_property.ProjectDir = C:\Users\micha\git\tbf\SharedComponents\
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs b/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs
new file mode 100644
index 000000000..c11666bec
--- /dev/null
+++ b/SharedComponents/obj/Debug/net472/SharedComponents.GlobalUsings.g.cs
@@ -0,0 +1,7 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/SharedComponents/obj/SharedComponents.csproj.nuget.g.props b/SharedComponents/obj/SharedComponents.csproj.nuget.g.props
new file mode 100644
index 000000000..c2b287e0d
--- /dev/null
+++ b/SharedComponents/obj/SharedComponents.csproj.nuget.g.props
@@ -0,0 +1,15 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ $(UserProfile)\.nuget\packages\
+ C:\Users\micha\.nuget\packages\
+ PackageReference
+ 6.14.0
+
+
+
+
+
\ No newline at end of file
diff --git a/SharedComponents/obj/SharedComponents.csproj.nuget.g.targets b/SharedComponents/obj/SharedComponents.csproj.nuget.g.targets
new file mode 100644
index 000000000..babc2c6b6
--- /dev/null
+++ b/SharedComponents/obj/SharedComponents.csproj.nuget.g.targets
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/SharedDatabase/SharedDatabase.csproj b/SharedDatabase/SharedDatabase.csproj
index c7006dbab..185aa5146 100644
--- a/SharedDatabase/SharedDatabase.csproj
+++ b/SharedDatabase/SharedDatabase.csproj
@@ -25,7 +25,7 @@
pdbonly
true
bin\Release\
- TRACE;LANG_PL
+ TRACE
prompt
4
diff --git a/TBF.sln b/TBF.sln
index 38d2129d3..2dc522326 100644
--- a/TBF.sln
+++ b/TBF.sln
@@ -5,16 +5,18 @@ VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TBF", "TBF\TBF.csproj", "{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}"
ProjectSection(ProjectDependencies) = postProject
- {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28} = {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28}
- {C8939821-BA5C-4988-A3D0-BF53B74865C7} = {C8939821-BA5C-4988-A3D0-BF53B74865C7}
- {211B5E3F-9996-48A7-ABDE-C878DD2D71C2} = {211B5E3F-9996-48A7-ABDE-C878DD2D71C2}
{0C0A1F4D-1363-4544-A7C5-196C76D26CCA} = {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}
{0F79CA69-9DBC-41F3-A6FC-5A2937365343} = {0F79CA69-9DBC-41F3-A6FC-5A2937365343}
- {439D0878-C76E-452B-B17D-209A89E91D36} = {439D0878-C76E-452B-B17D-209A89E91D36}
- {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}
- {743DF7DB-C7B6-42EB-986D-0F485E5588E4} = {743DF7DB-C7B6-42EB-986D-0F485E5588E4}
- {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE} = {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE}
+ {211B5E3F-9996-48A7-ABDE-C878DD2D71C2} = {211B5E3F-9996-48A7-ABDE-C878DD2D71C2}
{32817BF9-E380-4467-9C7F-936F4B122BC7} = {32817BF9-E380-4467-9C7F-936F4B122BC7}
+ {439D0878-C76E-452B-B17D-209A89E91D36} = {439D0878-C76E-452B-B17D-209A89E91D36}
+ {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE} = {46E3B0E1-209F-4550-B0DD-D7E2C039B3CE}
+ {743DF7DB-C7B6-42EB-986D-0F485E5588E4} = {743DF7DB-C7B6-42EB-986D-0F485E5588E4}
+ {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28} = {7EBEEA14-91C4-48D7-AF0A-7A4BC3FF9A28}
+ {8F942729-F454-4C99-BA6C-746962065AE3} = {8F942729-F454-4C99-BA6C-746962065AE3}
+ {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}
+ {C8939821-BA5C-4988-A3D0-BF53B74865C7} = {C8939821-BA5C-4988-A3D0-BF53B74865C7}
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2} = {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Results", "Results\Results.csproj", "{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}"
@@ -26,8 +28,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Config", "Config\Config.csp
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResultsBrowser", "ResultsBrowser\ResultsBrowser.csproj", "{07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}"
ProjectSection(ProjectDependencies) = postProject
- {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}
{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} = {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}
+ {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTest", "DeviceTest\DeviceTest.csproj", "{6D3384DC-4638-4A92-91A8-F39D900377C6}"
@@ -104,6 +106,19 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LabelPrinting", "LabelPrint
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TBFTests", "TBFTests\TBFTests.csproj", "{77EB589F-C670-4489-AAD6-2A3C02061FD1}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppDiagnostic", "AppDiagnostic\AppDiagnostic.csproj", "{FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8F942729-F454-4C99-BA6C-746962065AE3} = {8F942729-F454-4C99-BA6C-746962065AE3}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedComponents", "SharedComponents\SharedComponents.csproj", "{8F942729-F454-4C99-BA6C-746962065AE3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sensus.iPerl.RfidCom", "..\iPerlHead\Sensus.iPerl.RfidCom\Sensus.iPerl.RfidCom.csproj", "{A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sensus.iPerl.TestConsole", "..\iPerlHead\Sensus.iPerl.TestConsole\Sensus.iPerl.TestConsole.csproj", "{5025ED8B-A94F-4E58-8BE0-68481B061609}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NfcS5_DLL", "..\NfcS5_DLL\NfcS5_DLL.csproj", "{5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -127,15 +142,15 @@ Global
{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|x86.ActiveCfg = Release|x86
{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|x86.Build.0 = Release|x86
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|x86.ActiveCfg = Debug|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.Build.0 = Release|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|x86.ActiveCfg = Release|Any CPU
- {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.Build.0 = Release|Any CPU
{743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -464,6 +479,66 @@ Global
{77EB589F-C670-4489-AAD6-2A3C02061FD1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{77EB589F-C670-4489-AAD6-2A3C02061FD1}.Release|x86.ActiveCfg = Release|Any CPU
{77EB589F-C670-4489-AAD6-2A3C02061FD1}.Release|x86.Build.0 = Release|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Debug|x86.Build.0 = Debug|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|x86.ActiveCfg = Release|Any CPU
+ {FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}.Release|x86.Build.0 = Release|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Debug|x86.Build.0 = Debug|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Release|x86.ActiveCfg = Release|Any CPU
+ {8F942729-F454-4C99-BA6C-746962065AE3}.Release|x86.Build.0 = Release|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Debug|x86.Build.0 = Debug|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|x86.ActiveCfg = Release|Any CPU
+ {A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|x86.Build.0 = Release|Any CPU
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|x86.ActiveCfg = Debug|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Debug|x86.Build.0 = Debug|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|Mixed Platforms.Build.0 = Release|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|x86.ActiveCfg = Release|x86
+ {5025ED8B-A94F-4E58-8BE0-68481B061609}.Release|x86.Build.0 = Release|x86
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Debug|x86.Build.0 = Debug|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|x86.ActiveCfg = Release|Any CPU
+ {5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/TBF/Resources/Strings.Designer.cs b/TBF/Resources/Strings.Designer.cs
index 2fb34f8b2..fdeb20e2d 100644
--- a/TBF/Resources/Strings.Designer.cs
+++ b/TBF/Resources/Strings.Designer.cs
@@ -401,6 +401,24 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Application diagnostic.
+ ///
+ internal static string AppDiagnostic {
+ get {
+ return ResourceManager.GetString("AppDiagnostic", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Application diagnostic.
+ ///
+ internal static string Application_Diagnostic {
+ get {
+ return ResourceManager.GetString("Application_Diagnostic", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Approval.
///
@@ -4775,6 +4793,15 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Reg. min step.
+ ///
+ internal static string RegulMinStep {
+ get {
+ return ResourceManager.GetString("RegulMinStep", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Relative Q from.
///
diff --git a/TBF/Resources/Strings.resx b/TBF/Resources/Strings.resx
index ecbc4fb1f..07bd257ef 100644
--- a/TBF/Resources/Strings.resx
+++ b/TBF/Resources/Strings.resx
@@ -197,6 +197,12 @@
Reg. valve
+
+
+ Reg. min step
+
+
+ Application diagnostic
Scale
@@ -2442,6 +2448,9 @@
Upgrade database
+
+
+ Application diagnostic
About
diff --git a/TBF/Rig/BuiltIn/SetValvesOp.cs b/TBF/Rig/BuiltIn/SetValvesOp.cs
index 5c01e037c..404440ddd 100644
--- a/TBF/Rig/BuiltIn/SetValvesOp.cs
+++ b/TBF/Rig/BuiltIn/SetValvesOp.cs
@@ -9,6 +9,7 @@ using Dirichlet.Numerics;
using TBF.Boxes;
using TBF.Rig.ControlBoard;
using TBF.Rig.GenericDevices;
+using System.Windows.Forms;
namespace TBF.Rig.BuiltIn
{
@@ -195,66 +196,79 @@ namespace TBF.Rig.BuiltIn
/// Only Elde.Valve valves are used, other valves on the lists are ignored
public SetValvesOp(IControlBoard cb, bool open, OutputPath outPath, DateTimeBox timeStamp, FloatBox switchTime)
{
- this.cb = cb;
- if (this.cb == null) throw new ArgumentNullException("ctrlBoard");
-
- this.timeStamp = timeStamp;
- this.switchTime = switchTime;
- this.startStopValveBitNr = outPath.StartValve1 is Valve.Valve ? (outPath.StartValve1 as Valve.Valve).BitPosition : 0;
-
- IList none = new List(); /// An empty list of valves
- switchPointsRaw = new List();
-
- if (open)
+ try
{
- if (outPath.InvertSV1)
- AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1
+ this.cb = cb;
+ if (this.cb == null) throw new ArgumentNullException("ctrlBoard");
+
+ this.timeStamp = timeStamp;
+ this.switchTime = switchTime;
+ this.startStopValveBitNr = outPath.StartValve1 is Valve.Valve ? (outPath.StartValve1 as Valve.Valve).BitPosition : 0;
+
+ IList none = new List(); /// An empty list of valves
+ switchPointsRaw = new List();
+
+ if (open)
+ {
+ if (outPath.InvertSV1)
+ AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1
+ else
+ AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1
+
+ if (outPath.StartValve2 != null)
+ {
+ if (outPath.InvertSV2)
+ AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), -outPath.LagSV2); /// close SV2 after lag
+ else
+ AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, -outPath.LagSV2); /// open SV2 after lag
+ }
+
+ if (outPath.StartValve3 != null)
+ {
+ if (outPath.InvertSV3)
+ AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), -outPath.LagSV3); /// close SV3 after lag
+ else
+ AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, -outPath.LagSV3); /// open SV3 after lag
+ }
+ }
else
- AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1
-
- if (outPath.StartValve2 != null)
{
- if (outPath.InvertSV2)
- AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), -outPath.LagSV2); /// close SV2 after lag
+ if (outPath.InvertSV1)
+ AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1
else
- AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, -outPath.LagSV2); /// open SV2 after lag
+ AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1
+
+ if (outPath.StartValve2 != null)
+ {
+ if (outPath.InvertSV2)
+ AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, outPath.LagSV2); /// open SV2 after lag
+ else
+ AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), outPath.LagSV2); /// close SV2 after lag
+ }
+
+ if (outPath.StartValve3 != null)
+ {
+ if (outPath.InvertSV3)
+ AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, outPath.LagSV3); /// open SV3 after lag
+ else
+ AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), outPath.LagSV3); /// close SV3 after lag
+ }
}
- if (outPath.StartValve3 != null)
- {
- if (outPath.InvertSV3)
- AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), -outPath.LagSV3); /// close SV3 after lag
- else
- AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, -outPath.LagSV3); /// open SV3 after lag
- }
+ switchPoints = SortAndMergeSwitchPoints(switchPointsRaw);
+ timeShift = -switchPoints[0].TimeSec;
+ MakeMasks(switchPoints, timeShift);
}
- else
+ catch (Exception ex)
{
- if (outPath.InvertSV1)
- AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); /// open SV1
- else
- AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); /// close SV1
-
- if (outPath.StartValve2 != null)
- {
- if (outPath.InvertSV2)
- AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, outPath.LagSV2); /// open SV2 after lag
- else
- AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), outPath.LagSV2); /// close SV2 after lag
- }
-
- if (outPath.StartValve3 != null)
- {
- if (outPath.InvertSV3)
- AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, outPath.LagSV3); /// open SV3 after lag
- else
- AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), outPath.LagSV3); /// close SV3 after lag
- }
+ MessageBox.Show(
+ $"Chyba počas zastavenia regulácie prietoku, v ramci SetValvesOp():\n{ex.Message}\n\nStack trace:\n{ex.StackTrace}",
+ "Chyba",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error
+ );
+ throw;
}
-
- switchPoints = SortAndMergeSwitchPoints(switchPointsRaw);
- timeShift = -switchPoints[0].TimeSec;
- MakeMasks(switchPoints, timeShift);
}
/// Start this operation
diff --git a/TBF/Rig/ControlBoard/IControlBoard.cs b/TBF/Rig/ControlBoard/IControlBoard.cs
index e427fcd7e..4fab38728 100644
--- a/TBF/Rig/ControlBoard/IControlBoard.cs
+++ b/TBF/Rig/ControlBoard/IControlBoard.cs
@@ -93,7 +93,7 @@ namespace TBF.Rig.ControlBoard
/// Operation
IOperation QueryMeasurementEndOp();
- void StopFlowControl(bool isFromUI, int regVId);
+ void StopFlowControl(bool isFromUI, int regVId, int regulationMinStep = 0);
void StopAll(bool isFromUI);
}
diff --git a/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs b/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs
index d54dc06c4..262f4d32e 100644
--- a/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs
+++ b/TBF/Rig/ControlBoard/Papouch/PapouchCB.cs
@@ -492,7 +492,7 @@ namespace TBF.Rig.ControlBoard.Papouch
return null;
}
- public void StopFlowControl(bool isFromUI, int rvId)
+ public void StopFlowControl(bool isFromUI, int rvId, int regulationMinStep = 0)
{
}
diff --git a/TBF/Rig/ControlBoard/Uni/Action.cs b/TBF/Rig/ControlBoard/Uni/Action.cs
index 549fef046..b271aed6e 100644
--- a/TBF/Rig/ControlBoard/Uni/Action.cs
+++ b/TBF/Rig/ControlBoard/Uni/Action.cs
@@ -55,6 +55,9 @@ namespace TBF.Rig.ControlBoard.Uni
public int StabTime { get; set; } /// SetFlow
public int InitDacVal { get; set; } /// SetFlow
public int DivThreshold { get; set; } /// StartTest argument
+ public int RegulationMinStep { get;
+ set;
+ }
public Action()
@@ -78,6 +81,7 @@ namespace TBF.Rig.ControlBoard.Uni
RVMovePar1 = 0;
RVMovePar2 = 0;
InitDacVal = 0;
+ RegulationMinStep = 0;
}
@@ -123,7 +127,7 @@ namespace TBF.Rig.ControlBoard.Uni
}
///----------------------------------------------------------------------------------------------
- public static Action MeasureFlow(bool isFromUI, int flowMeterId)
+ public static Action MeasureFlow(bool isFromUI, int flowMeterId, int regulationMinStep = 0)
{
return new Action
{
@@ -163,7 +167,7 @@ namespace TBF.Rig.ControlBoard.Uni
///----------------------------------------------------------------------------------------------
public static Action SetFlow(bool isFromUI, int regValveId, double freqLo, double freqHi,
- int pid, int stabTime_ms)
+ int pid, int stabTime_ms, int regulationMinStep = 0)
{
int rvMovePar1 = Convert.ToInt32(Math.Round(13.1072 * freqLo));
int rvMovePar2 = Convert.ToInt32(Math.Round(13.1072 * freqHi));
@@ -178,6 +182,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = RegValveMode.TargetFrequency,
RVMovePar1 = rvMovePar1,
RVMovePar2 = rvMovePar2,
+ //RegulationMinStep = regulationMinStep,
PID = pid,
TolerRV = (regValveId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx)
? Convert.ToInt32(Math.Round(13.1072 * 0.015 * freqLo)) : 0,
@@ -207,7 +212,7 @@ namespace TBF.Rig.ControlBoard.Uni
///----------------------------------------------------------------------------------------------
public static Action StartTest(bool isFromUI, int flowMId, int divId, int divThreshold,
bool isSyncMethod, bool isDivUsed, bool isDelayedStart, bool isStartStop,
- bool isProlonged, int totalPulsesCount, int massPulsesCount = 0)
+ bool isProlonged, int totalPulsesCount, int massPulsesCount = 0, int regulationMinStep = 0)
{
return new Action
{
@@ -225,6 +230,7 @@ namespace TBF.Rig.ControlBoard.Uni
TotalPulsesCount = totalPulsesCount,
MassPulsesCount = (massPulsesCount <= 0) ? totalPulsesCount : massPulsesCount,
StartStop = Command.Start,
+ //RegulationMinStep = regulationMinStep,
};
}
void SetStartTestArgs(Action action)
@@ -272,7 +278,7 @@ namespace TBF.Rig.ControlBoard.Uni
}
///----------------------------------------------------------------------------------------------
- public static Action RegVlvIncrMove(bool isFromUI, int regValveId, double timeSec)
+ public static Action RegVlvIncrMove(bool isFromUI, int regValveId, double timeSec, int regulationMinStep = 0)
{
int rvMovePar = Math.Abs(Convert.ToInt32(Math.Round(timeSec / 0.050))); /// Step is 50 ms
@@ -285,6 +291,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = (timeSec >= 0) ? RegValveMode.PulseWidth : (RegValveMode.PulseWidth | RegValveMode.NegPulseWidth),
RVMovePar1 = rvMovePar,
RVMovePar2 = rvMovePar,
+ //RegulationMinStep = regulationMinStep,
};
}
void SetRegVlvIncrMoveArgs(Action action)
@@ -293,6 +300,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = action.RegVMode;
RVMovePar1 = action.RVMovePar1;
RVMovePar2 = action.RVMovePar2;
+ //RegulationMinStep = action.RegulationMinStep;
}
/// Check whether new action arguments are compatible with alredy collected arguments (true = yes)
bool CheckSharedRegVlvIncrMoveArgs(Action newAction)
@@ -302,7 +310,7 @@ namespace TBF.Rig.ControlBoard.Uni
}
///----------------------------------------------------------------------------------------------
- public static Action RegVlvMoveToPos(bool isFromUI, int regValveId, int adcValLo, int adcValHi = -1)
+ public static Action RegVlvMoveToPos(bool isFromUI, int regValveId, int adcValLo, int adcValHi = -1, int regulationMinStep = 0)
{
int rvMovePar1, rvMovePar2;
@@ -318,7 +326,7 @@ namespace TBF.Rig.ControlBoard.Uni
rvMovePar1 = Math.Max(adcValLo - 5, 0);
rvMovePar2 = Math.Min(adcValLo + 5, 1023);
}
-
+
return new Action
{
ActionId = ActionID.RegVlvMoveToPos,
@@ -328,6 +336,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = RegValveMode.TargetPosition,
RVMovePar1 = rvMovePar1,
RVMovePar2 = rvMovePar2,
+ //RegulationMinStep = regulationMinStep,
};
}
void SetRegVlvMoveToPosArgs(Action action)
@@ -336,6 +345,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = action.RegVMode;
RVMovePar1 = action.RVMovePar1;
RVMovePar2 = action.RVMovePar2;
+ //RegulationMinStep = action.RegulationMinStep;
}
/// Check whether new action arguments are compatible with alredy collected arguments (true = yes)
bool CheckSharedRegVlvMoveToPosArgs(Action newAction)
@@ -345,7 +355,7 @@ namespace TBF.Rig.ControlBoard.Uni
}
///----------------------------------------------------------------------------------------------
- public static Action RegVlvStop(bool isFromUI, int regValveId)
+ public static Action RegVlvStop(bool isFromUI, int regValveId, int RegulationMinStep = 0)
{
return new Action
{
@@ -356,6 +366,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = RegValveMode.Stop,
RVMovePar1 = 0,
RVMovePar2 = 0,
+ //RegulationMinStep = RegulationMinStep
};
}
void SetRegVlvStopArgs(Action action)
@@ -364,6 +375,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVMode = action.RegVMode;
RVMovePar1 = action.RVMovePar1;
RVMovePar2 = action.RVMovePar2;
+ //RegulationMinStep = action.RegulationMinStep;
}
/// Check whether new action arguments are compatible with alredy collected arguments (true = yes)
bool CheckSharedRegVlvStopArgs(Action newAction)
@@ -604,7 +616,8 @@ namespace TBF.Rig.ControlBoard.Uni
combinedAction.TolerRV,
combinedAction.StabTime,
combinedAction.InitDacVal,
- combinedAction.DivThreshold);
+ combinedAction.DivThreshold,
+ combinedAction.RegulationMinStep);
return combinedAction;
}
diff --git a/TBF/Rig/ControlBoard/Uni/OutputMessage.cs b/TBF/Rig/ControlBoard/Uni/OutputMessage.cs
index 2d1aeee75..1d51fff33 100644
--- a/TBF/Rig/ControlBoard/Uni/OutputMessage.cs
+++ b/TBF/Rig/ControlBoard/Uni/OutputMessage.cs
@@ -5,6 +5,8 @@ using System;
using System.Diagnostics;
using log4net;
using Dirichlet.Numerics;
+using Common;
+using System.Web.Routing;
namespace TBF.Rig.ControlBoard.Uni
{
@@ -88,7 +90,7 @@ namespace TBF.Rig.ControlBoard.Uni
message[30] = (byte)(action.RVMovePar2 & 0xFF);
message[31] = (byte)((action.RVMovePar2 >> 8) & 0xFF);
message[32] = GetRVStopParam(action);
-
+
/// DA1
message[33] = (byte)(arguments.InitDacVal & 0xFF);
message[34] = (byte)((arguments.InitDacVal >> 8) & 0xFF);
@@ -98,8 +100,21 @@ namespace TBF.Rig.ControlBoard.Uni
message[37] = (byte)Math.Max(0, Math.Min(255, arguments.StabTime)); /// StabRV
message[38] = (byte)((arguments.DivThreshold >> 2) & 0xFF);
- message[39] = 0;
- message[40] = 0;
+ //---
+ message[39] = (byte)((action.RegulationMinStep << 4) & 0xFF); // ak 0 = koli kompatibilite, 1-6 = hodnoty prislusne pre spodnu saturaciu vypinacej periody casu
+ message[40] = (byte)((action.RegulationMinStep << 4) & 0xFF);
+ //---
+ /*int x = 0;
+ if (action.RegVId == 1 || action.RegVId == 2) x = 3;
+ else if (action.RegVId == 3 || action.RegVId == 4) x = 5;
+ else if (action.RegVId == 5 || action.RegVId == 5) x = 3;
+ message[39] = (byte)((x << 4) & 0xFF);
+ message[40] = (byte)((x << 4) & 0xFF);*/
+ /*//---
+ message[39] = 0x50; // ak 0 = koli kompatibilite, 1-6 = hodnoty prislusne pre spodnu saturaciu vypinacej periody casu
+ message[40] = 0x50;
+ //---*/
+
Debug.Assert(40 == PayloadLen + 2);
/// Checksum (2 bytes)
@@ -108,6 +123,8 @@ namespace TBF.Rig.ControlBoard.Uni
message[PayloadLen + 3] = (byte)(checksum & 0xFF);
message[PayloadLen + 4] = (byte)((checksum >> 8) & 0xFF);
+ log.Info("");
+
return message;
}
@@ -151,11 +168,16 @@ namespace TBF.Rig.ControlBoard.Uni
return (byte)0x20;
}
- if ((a.ActionId & ActionID.SetFlow) != 0 && a.RegVId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx)
+ else if ((a.ActionId & ActionID.SetFlow) != 0 && a.RegVId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx)
{
return (byte)0x42;
}
+ /*else
+ {
+ return (a.RegulationMinStep >= 0 || a.RegulationMinStep <= 6)?(byte)(a.RegulationMinStep << 4):(byte)(7<<4);
+ }*/
+
return 0;
}
}
diff --git a/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs b/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs
index aac89e6e3..f2732345c 100644
--- a/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs
+++ b/TBF/Rig/ControlBoard/Uni/StandingStartStopTestOp.cs
@@ -2,6 +2,9 @@
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
+using System.Reflection;
+using System.Text;
+using System.Windows.Forms;
using log4net;
using TBF.Rig.GenericDevices;
@@ -16,7 +19,8 @@ namespace TBF.Rig.ControlBoard.Uni
/// Set by the constructor
///
readonly UniCB uniCB;
- readonly TBF.Rig.Uni.FlowMeter.FlowMeter flowMeter;
+ readonly object flowMeter;
+ readonly TBF.Rig.Uni.FlowMetersInParallel.FlowMeter flowMeterInParallel;
readonly TBF.Rig.Uni.Diverter.Diverter diverter;
readonly int pulsesCount; /// Number of reference pulses for a complete test
readonly bool withDiverter; /// Test with diverter (and scale)
@@ -50,36 +54,119 @@ namespace TBF.Rig.ControlBoard.Uni
public StandingStartStopTestOp(UniCB cb, OutputPath devices, int pulsesCount, bool withDiverter)
{
this.uniCB = cb;
+ try
+ {
+ flowMeter = devices.FlowMeter as TBF.Rig.Uni.FlowMeter.FlowMeter;
+ if(flowMeter == null) flowMeter = devices.FlowMeter as TBF.Rig.Uni.FlowMetersInParallel.FlowMeter;
- flowMeter = devices.FlowMeter as TBF.Rig.Uni.FlowMeter.FlowMeter;
- if (flowMeter == null) throw new ArgumentNullException("Invalid flow meter");
+ if (flowMeter == null) throw new ArgumentNullException("Invalid flow meter");
+ }
+ catch (Exception ex)
+ {
+ string deviceInfo = GetAllDevicesInfo(devices);
+ string flowMeterStatus = devices.FlowMeter == null
+ ? "devices.FlowMeter je NULL"
+ : $"devices.FlowMeter je typu: {devices.FlowMeter.GetType().FullName}";
+
+ MessageBox.Show(
+ $"Chyba počas zastavenia regulácie prietoku, v ramci StandingStartStopTestOp() pre flowMeter:\n" +
+ $"{ex.Message}\n\n" +
+ $"Diagnostika:\n{flowMeterStatus}\n\n" +
+ $"{deviceInfo}\n\n" +
+ $"Stack trace:\n{ex.StackTrace}",
+ "Chyba",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error
+ );
+
+ throw;
+ }
this.pulsesCount = pulsesCount;
this.withDiverter = withDiverter;
if (withDiverter)
{
- diverter = devices.Diverter as TBF.Rig.Uni.Diverter.Diverter;
- if (diverter == null) throw new ArgumentNullException("Invalid diverter");
+ try
+ {
+ diverter = devices.Diverter as TBF.Rig.Uni.Diverter.Diverter;
+ if (diverter == null) throw new ArgumentNullException("Invalid diverter");
+ }
+ catch (Exception ex)
+ {
+ string deviceInfo = GetAllDevicesInfo(devices);
+
+ MessageBox.Show(
+ $"Chyba počas zastavenia regulácie prietoku, v ramci StandingStartStopTestOp() pre diverter:\n" +
+ $"{ex.Message}\n\n{deviceInfo}\n\nStack trace:\n{ex.StackTrace}",
+ "Chyba",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error
+ );
+
+ throw;
+ }
}
log.Debug(this.ToString());
}
- ///
+ string GetAllDevicesInfo(object obj)
+ {
+ if (obj == null) return "devices objekt je null.";
+
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine("Zoznam zariadení v devices:");
+
+ var props = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
+ foreach (var prop in props)
+ {
+ try
+ {
+ object value = prop.GetValue(obj);
+ string valueStr = value != null ? value.ToString() : "null";
+ sb.AppendLine($"{prop.Name}: {valueStr}");
+ }
+ catch (Exception ex)
+ {
+ sb.AppendLine($"{prop.Name}: [Chyba pri načítaní - {ex.Message}]");
+ }
+ }
+
+ return sb.ToString();
+ }
+
+ ///
/// Start this operation
///
- public void Start()
+ public void Start()
{
- log.InfoFormat("Start() Et#={0} pulses={1} withDiverter={2}", flowMeter.Idx1, pulsesCount, withDiverter);
+ if (flowMeter is TBF.Rig.Uni.FlowMeter.FlowMeter)
+ {
+ log.InfoFormat("Start() Et#={0} pulses={1} withDiverter={2}", ((TBF.Rig.Uni.FlowMeter.FlowMeter)flowMeter).Idx1, pulsesCount, withDiverter);
- /// Start the test (and the flow measurement)
- if (withDiverter) { uniCB.DivResolution = diverter.Resolution; }
- uniCB.SetActivity(Activity.StandingStartStopTest);
- uniCB.StartTest(false, flowMeter.Idx1, (withDiverter ? diverter.DiverterNr : 0), 0,
- false, withDiverter, false, true, false, pulsesCount);
+ /// Start the test (and the flow measurement)
+ if (withDiverter) { uniCB.DivResolution = diverter.Resolution; }
+ uniCB.SetActivity(Activity.StandingStartStopTest);
+ uniCB.StartTest(false, ((TBF.Rig.Uni.FlowMeter.FlowMeter)flowMeter).Idx1, (withDiverter ? diverter.DiverterNr : 0), 0,
+ false, withDiverter, false, true, false, pulsesCount);
- opState = OpState.StartingTest;
+ opState = OpState.StartingTest;
+ }
+ else if (flowMeter is TBF.Rig.Uni.FlowMetersInParallel.FlowMeter)
+ {
+ log.InfoFormat("Start() Et#={0} pulses={1} withDiverter={2}", ((TBF.Rig.Uni.FlowMetersInParallel.FlowMeter)flowMeter).Idx1, pulsesCount, withDiverter);
+
+ /// Start the test (and the flow measurement)
+ if (withDiverter) { uniCB.DivResolution = diverter.Resolution; }
+ uniCB.SetActivity(Activity.StandingStartStopTest);
+ uniCB.StartTest(false, ((TBF.Rig.Uni.FlowMetersInParallel.FlowMeter)flowMeter).Idx1, (withDiverter ? diverter.DiverterNr : 0), 0,
+ false, withDiverter, false, true, false, pulsesCount);
+
+ opState = OpState.StartingTest;
+ }
+
+
}
///
diff --git a/TBF/Rig/ControlBoard/Uni/UniCB.cs b/TBF/Rig/ControlBoard/Uni/UniCB.cs
index cedcc4353..ef5dd1d33 100644
--- a/TBF/Rig/ControlBoard/Uni/UniCB.cs
+++ b/TBF/Rig/ControlBoard/Uni/UniCB.cs
@@ -17,6 +17,8 @@ using TBF.Boxes;
using TBF.Rig.GenericDevices;
using TBF.Rig.Sequences;
using TBF.UiBridge;
+using AppDiagnostic;
+using SharedComponents;
namespace TBF.Rig.ControlBoard.Uni
{
@@ -547,7 +549,7 @@ namespace TBF.Rig.ControlBoard.Uni
if (!outputsInitialized || (outputLatch & routeMask) != (route & routeMask)) /// || (StateMachine.Time - lastStateMachineTime) >= 15)
{
- var actionsToModify = actionQueue.Where(x => (x.ActionId == ActionID.ChangeRoute));
+ var actionsToModify = actionQueue.Where(x => (x.ActionId == ActionID.ChangeRoute));
bool oneModified = false;
foreach (var a in actionsToModify)
{
@@ -573,7 +575,11 @@ namespace TBF.Rig.ControlBoard.Uni
var combinedAction = Action.FetchNonConflictingActions(actionQueue); /// Default action is RequestDataOnly
+
+ combinedAction.RegulationMinStep = devices.RegulMinStep;
+
byte[] outData = OutputMessage.GetMessage(combinedAction, config, (ulong)valvesToInvert);
+
if (outData != null && outData.Length > 0)
{
if ((combinedAction.ActionId & ActionID.ChangeRoute) != 0)
@@ -595,7 +601,7 @@ namespace TBF.Rig.ControlBoard.Uni
{
serialPort.Write(outData, 0, outData.Length);
lastSentTime = DateTime.Now;
- }
+ }
log.Debug(" " + OutputMessage.Caption());
log.Debug(Telegram.LogTelegram(string.Format("Sent {0}: ", lastSentTime.ToString("HH:mm:ss")), outData));
@@ -615,7 +621,7 @@ namespace TBF.Rig.ControlBoard.Uni
{
}
- #endregion
+#endregion
#region IControlBoard interface
@@ -781,12 +787,13 @@ namespace TBF.Rig.ControlBoard.Uni
#endregion
- public void MeasureFlow(bool isFromUI, int flowMeterId)
+ public void MeasureFlow(bool isFromUI, int flowMeterId, int regulationMinStep = 0)
{
if (IsUIBlocked && isFromUI) return;
- actionQueue.Enqueue(Action.MeasureFlow(isFromUI, flowMeterId));
+ actionQueue.Enqueue(Action.MeasureFlow(isFromUI, flowMeterId, regulationMinStep));
log.InfoFormat("Enqueue( MeasureFlow(fm={0}) )", flowMeterId);
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -794,12 +801,13 @@ namespace TBF.Rig.ControlBoard.Uni
/// To be used with a regulation valve controlled by incremental pulses.
/// Stability time is fixed: 200 ms
///
- public void SetFlow(bool isFromUI, int regVId, double freqLo, double freqHi)
+ public void SetFlow(bool isFromUI, int regVId, double freqLo, double freqHi, int regulationMinStep = 0)
{
if (IsUIBlocked && isFromUI) return;
- actionQueue.Enqueue(Action.SetFlow(isFromUI, regVId, freqLo, freqHi, Convert.ToInt32(Math.Round(Devices.PidCoef)), 200));
+ actionQueue.Enqueue(Action.SetFlow(isFromUI, regVId, freqLo, freqHi, Convert.ToInt32(Math.Round(Devices.PidCoef)), 200, regulationMinStep));
log.InfoFormat("Enqueue( SetFlow(rv={0}, fLo={1}, fHi={2}, pid={3}) )", regVId, freqLo, freqHi, Convert.ToInt32(Math.Round(Devices.PidCoef)));
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -814,22 +822,23 @@ namespace TBF.Rig.ControlBoard.Uni
totalPulsesCount, massPulsesCount));
log.InfoFormat("Enqueue( StartTest(fm={0}, div={1}, Sync={2}, withDiv={3}, s/s={4}, prolonged={5} pulsesCount={6} massPulsesCount={7}) )",
flowMId, divId, isSyncMethod, isDivUsed, isStartStop, isProlonged, totalPulsesCount, massPulsesCount);
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
- public void StopFlowControl(bool isFromUI, int regVId)
+ public void StopFlowControl(bool isFromUI, int regVId, int regulationMinStep = 0)
{
if (IsUIBlocked && isFromUI) return;
if (regVId < TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx)
{
- actionQueue.Enqueue(Action.RegVlvStop(isFromUI, regVId));
+ actionQueue.Enqueue(Action.RegVlvStop(isFromUI, regVId, regulationMinStep));
log.InfoFormat("Enqueue( RegVlvStop(rv={0}) )", regVId);
}
else if (regVId == TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx)
{
int dacVal = Data.StavDA[0];
- actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, dacVal));
+ actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, dacVal, regulationMinStep));
log.InfoFormat("Enqueue( RegVlvMoveToPos(rv={0}, positionLo={1}) )", regVId, dacVal);
}
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
@@ -841,6 +850,7 @@ namespace TBF.Rig.ControlBoard.Uni
actionQueue.Enqueue(Action.Stop(isFromUI));
log.InfoFormat("Enqueue( Stop() )");
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -849,11 +859,11 @@ namespace TBF.Rig.ControlBoard.Uni
///
/// Reg. valve ID
/// Time in seconds, positive value opens the reg. valve
- public void RegVlvIncrMove(bool isFromUI, int regVId, double time)
+ public void RegVlvIncrMove(bool isFromUI, int regVId, double time, int regulationMinStep = 0)
{
if (IsUIBlocked && isFromUI || regVId >= TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) return;
- var newAction = Action.RegVlvIncrMove(isFromUI, regVId, time);
+ var newAction = Action.RegVlvIncrMove(isFromUI, regVId, time, regulationMinStep);
var actionsToModify = actionQueue.Where(x => (x.ActionId == ActionID.RegVlvIncrMove && x.RegVId == newAction.RegVId));
bool oneModified = false;
@@ -870,7 +880,7 @@ namespace TBF.Rig.ControlBoard.Uni
oneModified = true;
log.InfoFormat("RegVlvIncrMove(UI={0}, RV={1}, time={2}) ... an action in the queue modified", isFromUI, regVId, time);
}
-
+
if (!oneModified)
{
actionQueue.Enqueue(newAction);
@@ -885,12 +895,13 @@ namespace TBF.Rig.ControlBoard.Uni
///
/// Reg. valve ID
/// Reg. valve position (0 .. 1.0)
- public void RegVlvMoveToPos(bool isFromUI, int regVId, int adcValLo, int adcValHi = -1)
+ public void RegVlvMoveToPos(bool isFromUI, int regVId, int adcValLo, int adcValHi = -1, int regulationMinStep = 0)
{
if (IsUIBlocked && isFromUI || regVId > TBF.Rig.Uni.RegValveAnalog.RegValve.RVAnalogIdx) return;
- actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, adcValLo, adcValHi));
+ actionQueue.Enqueue(Action.RegVlvMoveToPos(isFromUI, regVId, adcValLo, adcValHi, regulationMinStep));
log.InfoFormat("Enqueue( RegVlvMoveToPos(rv={0}, positionLo={1}, positionHi={2}) )", regVId, adcValLo, adcValHi);
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -907,6 +918,7 @@ namespace TBF.Rig.ControlBoard.Uni
actionQueue.Enqueue(Action.Stop(isFromUI));
}
log.InfoFormat("Enqueue( SwitchDiverter(div#={0}, toTank={1}) )", divNr1, toTank);
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -916,6 +928,7 @@ namespace TBF.Rig.ControlBoard.Uni
actionQueue.Enqueue(Action.DelayStartOrStop(isFromUI));
log.InfoFormat("Enqueue( DelayStartOrStop() )");
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -930,6 +943,7 @@ namespace TBF.Rig.ControlBoard.Uni
DivTransitionData.DiverterAssociationValidUntil = StateMachine.Time + 5;
actionQueue.Enqueue(Action.GetDiverterTransitionData(isFromUI));
log.InfoFormat("Enqueue( GetDiverterTransitionData(div#={0}, toTank={1}) )", diverter.DiverterNr, toTank);
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -939,6 +953,7 @@ namespace TBF.Rig.ControlBoard.Uni
actionQueue.Enqueue(Action.GetScopeAnalyzerData(isFromUI));
log.InfoFormat("Enqueue( GetScopeAnalyzerData() )");
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -948,6 +963,7 @@ namespace TBF.Rig.ControlBoard.Uni
actionQueue.Enqueue(Action.ResetScopeAnalyzer(isFromUI));
log.InfoFormat("Enqueue( ResetScopeAnalyzer() )");
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
@@ -957,6 +973,7 @@ namespace TBF.Rig.ControlBoard.Uni
actionQueue.Enqueue(Action.GetSwitchCounterData(isFromUI));
log.InfoFormat("Enqueue( GetSwitchCounterData() )");
+
foreach (var a in actionQueue) log.DebugFormat(" {0}", a);
}
diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs
index 49f2f7776..b55c4afc0 100644
--- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs
+++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.Designer.cs
@@ -33,10 +33,9 @@ namespace TBF.Rig.DataEntry.iPerl
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CycleBeginningForm));
this.okButton = new System.Windows.Forms.Button();
- this.orderGroupBox = new System.Windows.Forms.GroupBox();
- this.orderComboBox = new System.Windows.Forms.ComboBox();
this.pictureBox = new System.Windows.Forms.PictureBox();
- this.orderGroupBox.SuspendLayout();
+ this.orderComboBox = new TBF.UI.Shared.SuggestComboBox();
+ this.labelOrder = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
this.SuspendLayout();
//
@@ -48,50 +47,53 @@ namespace TBF.Rig.DataEntry.iPerl
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
- // orderGroupBox
- //
- this.orderGroupBox.Controls.Add(this.orderComboBox);
- resources.ApplyResources(this.orderGroupBox, "orderGroupBox");
- this.orderGroupBox.ForeColor = System.Drawing.Color.Black;
- this.orderGroupBox.Name = "orderGroupBox";
- this.orderGroupBox.TabStop = false;
- //
- // orderComboBox
- //
- this.orderComboBox.FormattingEnabled = true;
- resources.ApplyResources(this.orderComboBox, "orderComboBox");
- this.orderComboBox.Name = "orderComboBox";
- //
// pictureBox
//
resources.ApplyResources(this.pictureBox, "pictureBox");
this.pictureBox.Name = "pictureBox";
this.pictureBox.TabStop = false;
//
+ // orderComboBox
+ //
+ this.orderComboBox.DropDownHeight = 530;
+ this.orderComboBox.FilterRule = null;
+ resources.ApplyResources(this.orderComboBox, "orderComboBox");
+ this.orderComboBox.FormattingEnabled = true;
+ this.orderComboBox.Name = "orderComboBox";
+ this.orderComboBox.PropertySelector = null;
+ this.orderComboBox.SuggestBoxHeight = 192;
+ this.orderComboBox.SuggestListOrderRule = null;
+ //
+ // labelOrder
+ //
+ resources.ApplyResources(this.labelOrder, "labelOrder");
+ this.labelOrder.Name = "labelOrder";
+ //
// CycleBeginningForm
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.DarkGray;
+ this.Controls.Add(this.labelOrder);
+ this.Controls.Add(this.orderComboBox);
this.Controls.Add(this.pictureBox);
- this.Controls.Add(this.orderGroupBox);
this.Controls.Add(this.okButton);
this.ForeColor = System.Drawing.Color.Black;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "CycleBeginningForm";
this.TopMost = true;
this.Load += new System.EventHandler(this.CycleBeginningForm_Load);
- this.orderGroupBox.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
this.ResumeLayout(false);
+ this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button okButton;
- private System.Windows.Forms.GroupBox orderGroupBox;
- private System.Windows.Forms.ComboBox orderComboBox;
private System.Windows.Forms.PictureBox pictureBox;
+ private UI.Shared.SuggestComboBox orderComboBox;
+ private System.Windows.Forms.Label labelOrder;
}
}
\ No newline at end of file
diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs
index c93de56d2..2c9e579b7 100644
--- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs
+++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs
@@ -11,7 +11,6 @@ using TBF.Rig.Sequences;
using TBF.Rig.Output.DB.SensusOracle;
using TBF.Resources;
using System.Drawing;
-using NHibernate;
namespace TBF.Rig.DataEntry.iPerl
{
@@ -24,8 +23,7 @@ namespace TBF.Rig.DataEntry.iPerl
readonly EntryFormCfg cfg;
/// Loaded from database beforethe form is open
- IList listOfOrders;
- string preselectedOrder;
+ IList listOfOrders;
/// To be retrieved after the form is closed
public string PurchaseOrder;
@@ -42,7 +40,6 @@ namespace TBF.Rig.DataEntry.iPerl
{
InitializeComponent();
ControlBox = false;
- preselectedOrder = null;
completed = false;
StartForceCloseHandler();
@@ -53,12 +50,11 @@ namespace TBF.Rig.DataEntry.iPerl
/// Constructor
///
/// Number of text boxes for serial numbers
- public CycleBeginningForm(int waterMetersCount, EntryFormCfg cfg, string preselectedOrder = null)
+ public CycleBeginningForm(int waterMetersCount, EntryFormCfg cfg)
: this()
{
this.WaterMetersCount = waterMetersCount;
this.cfg = cfg;
- this.preselectedOrder = preselectedOrder;
SNText = null;
Disabled = null;
}
@@ -67,49 +63,12 @@ namespace TBF.Rig.DataEntry.iPerl
private void CycleBeginningForm_Load(object sender, EventArgs e)
{
Text = Strings.Data;
- orderGroupBox.Text = Strings.Purchase_order;
+ labelOrder.Text = Strings.Purchase_order;
okButton.Text = Strings.OkBtnText;
- listOfOrders = new List();
-
- if ((cfg.Orders == Orders.FromOracle || cfg.Orders == Orders.CombinedAndFromOracle)
- && ProcessData.OracleDB != null)
- {
- foreach (var o in ProcessData.OracleDB.ReadOrders())
- {
- listOfOrders.Add(o);
- }
- }
-
- if ((cfg.Orders == Orders.FromTracingDB || cfg.Orders == Orders.CombinedAndFromTracingDB)
- && ProcessData.TracingDB != null
- && ProcessData.TracingDB.DebugLevel == DebugMode.Normal)
- {
- foreach (var o in ProcessData.TracingDB.ReadOrders())
- {
- listOfOrders.Add(o);
- }
- }
-
- string insertFirst = null;
- if (!string.IsNullOrEmpty(preselectedOrder))
- {
- insertFirst = preselectedOrder;
- }
- else
- {
- if (Program.LocalSettings.PurchaseOrderHistoryCount > 0)
- {
- foreach (var o in listOfOrders)
- {
- if (o.POName == Program.LocalSettings.PurchaseOrderHistory[0])
- {
- insertFirst = o.POName;
- break;
- }
- }
- }
- }
+ listOfOrders = ((cfg.Orders == Orders.FromOracle || cfg.Orders == Orders.CombinedAndFromOracle) && ProcessData.OracleDB != null)
+ ? ProcessData.OracleDB.ReadOrders()
+ : new List();
switch (cfg.Orders)
{
@@ -117,71 +76,25 @@ namespace TBF.Rig.DataEntry.iPerl
PrepareOrderCombo(orderComboBox);
break;
- case Orders.FromOracle:
- case Orders.FromTracingDB:
- if (insertFirst != null)
- {
- orderComboBox.Items.Add(insertFirst);
- orderComboBox.Text = insertFirst;
- }
-
- foreach (var o in listOfOrders)
- if (o.POName != insertFirst)
- orderComboBox.Items.Add(o.POName);
- break;
-
case Orders.CombinedAndFromOracle:
- case Orders.CombinedAndFromTracingDB:
- if (insertFirst != null)
- {
- orderComboBox.Items.Add(insertFirst);
- orderComboBox.Text = insertFirst;
- }
- orderComboBox.Items.Add("BBAAMMXX");
- orderComboBox.Items.Add("BBAAOMXX");
- orderComboBox.Items.Add("BBAAQMXX");
- orderComboBox.Items.Add("BBAATMFR");
- orderComboBox.Items.Add("BBAATMXX");
- orderComboBox.Items.Add("CCAAMMXX");
- orderComboBox.Items.Add("CCAAOMXX");
- orderComboBox.Items.Add("CCAAQMXX");
- orderComboBox.Items.Add("CCAATMFR");
- orderComboBox.Items.Add("CCAATMXX");
- orderComboBox.Items.Add("DDAAMMXX");
- orderComboBox.Items.Add("DDAAOMXX");
- orderComboBox.Items.Add("DDAAQMXX");
- orderComboBox.Items.Add("DDAATMXX");
- orderComboBox.Items.Add("DEAAMMXX");
- orderComboBox.Items.Add("DEAAOMXX");
- orderComboBox.Items.Add("DEAAQMXX");
- orderComboBox.Items.Add("DEAATMXX");
- orderComboBox.Items.Add("EEAAMMXX");
- orderComboBox.Items.Add("EEAAOMXX");
- orderComboBox.Items.Add("EEAAQMXX");
- orderComboBox.Items.Add("EEAATMFR");
- orderComboBox.Items.Add("EEAATMXX");
- orderComboBox.Items.Add("FFAAMMXX");
- orderComboBox.Items.Add("FFAAOMXX");
- orderComboBox.Items.Add("FFAAQMXX");
- orderComboBox.Items.Add("FFAATMFR");
- orderComboBox.Items.Add("FFAATMXX");
- orderComboBox.Items.Add("GFAAMMXX");
- orderComboBox.Items.Add("GFAAOMXX");
- orderComboBox.Items.Add("GFAAQMXX");
- orderComboBox.Items.Add("GFAATMXX");
+ case Orders.FromOracle:
foreach (var o in listOfOrders)
- if (o.POName != insertFirst)
- orderComboBox.Items.Add(o.POName);
+ {
+ orderComboBox.Items.Add(o.POName + " - " + o.SNPrefix);
+ }
+ if (Program.LocalSettings.PurchaseOrderHistoryCount > 0)
+ orderComboBox.SelectedIndex = orderComboBox.FindString(Program.LocalSettings.PurchaseOrderHistory[0]);
+
break;
}
///
/// Draw an appropriate test bench picture
///
- Side side = (TBF.Rig.Sequences.ProcessData.BenchInfo is DataContainer.iPerlBenchInfo.Component)
- ? (TBF.Rig.Sequences.ProcessData.BenchInfo as DataContainer.iPerlBenchInfo.Component).Side
- : Side.Left;
+ Side side = (ProcessData.BenchInfo is DataContainer.iPerlBenchInfo.Component)
+ ? (ProcessData.BenchInfo as DataContainer.iPerlBenchInfo.Component).Side
+ : Side.Left;
if ((cfg.Direction == Direction.Reversed_LR) && (side == Side.Left))
{
/// direction L->R (reversed), left side
@@ -202,7 +115,9 @@ namespace TBF.Rig.DataEntry.iPerl
/// direction R->L (forward), left side
pictureBox.Image = Image.FromFile(string.Format("{0}\\Pictures\\forward_dir_left.jpg", Program.ExecutableDir, true));
}
- }
+ pictureBox.SendToBack();
+
+ }
///
/// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array
@@ -223,45 +138,20 @@ namespace TBF.Rig.DataEntry.iPerl
private void okButton_Click(object sender, EventArgs e)
{
- if (orderComboBox.Text.Length > 8 ||
- (cfg.Orders != Orders.Arbitrary && !orderComboBox.Items.Contains(orderComboBox.Text)))
+ PurchaseOrder = orderComboBox.Text.Split(' ')[0].Trim();
+
+ if (PurchaseOrder.Length > 10 ||
+ (cfg.Orders != Orders.Arbitrary && orderComboBox.FindString(PurchaseOrder) < 0))
{
MessageBox.Show(Strings.Invalid_order_number, Strings.Error, MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
return;
}
- IOrderInfo oInfo = (listOfOrders == null) ? null : listOfOrders.FirstOrDefault(x => x.POName == orderComboBox.Text);
- ///
- if (oInfo is Output.DB.SensusOracle.OrderDetails)
- {
- ProcessData.OrderInfo = oInfo;
- }
- else if (oInfo is SharedDatabase.Entities.OrderInfo && ProcessData.TracingDB != null)
- {
- try
- {
- using (var session = ProcessData.TracingDB.SessionFactory.OpenSession())
- {
- var list = session.QueryOver()
- .Where(x => (x.POName == Program.MainWnd.SelectedProcedure.OrderInfo.POName))
- .List();
- ProcessData.OrderInfo = (list.Count == 1) ? list[0] : null;
- string workflow = (list.Count == 1) ? list[0].Workflow : null;
- ProcessData.WorkflowSummary = SharedDatabase.WorkflowSummary.ReadFromDB(workflow, "test", session);
- session.Close();
- }
- }
- catch (Exception ex)
- {
- log.ErrorFormat("Unable to load an order, workflow or workstep: {0}", ex);
- ProcessData.OrderInfo = null;
- ProcessData.WorkflowSummary = null;
- }
- }
+ ProcessData.OrderDetails = (listOfOrders == null) ? null : listOfOrders.FirstOrDefault(x => x.POName == orderComboBox.Text);
- PurchaseOrder = orderComboBox.Text;
- Program.LocalSettings.UpdateHistory(orderComboBox.Text, ref Program.LocalSettings.PurchaseOrderHistory);
+
+ Program.LocalSettings.UpdateHistory(PurchaseOrder, ref Program.LocalSettings.PurchaseOrderHistory);
completed = true;
Close();
@@ -285,6 +175,6 @@ namespace TBF.Rig.DataEntry.iPerl
Close();
}
- #endregion
- }
+ #endregion
+ }
}
diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx
index 5e7e06de5..99acf52f6 100644
--- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx
+++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.resx
@@ -122,10 +122,14 @@
Verdana, 14.25pt
- 627, 26
+ 836, 32
+
+
+
+ 4, 4, 4, 4
- 112, 63
+ 149, 78
@@ -144,61 +148,16 @@
$this
- 2
-
-
- 90, 32
-
-
- 432, 31
-
-
- 0
-
-
- orderComboBox
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- orderGroupBox
-
-
- 0
-
-
- Verdana, 14.25pt
-
-
- 28, 12
-
-
- 565, 82
-
-
- 0
-
-
- Order
-
-
- orderGroupBox
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
+ 4
- 28, 118
+ 37, 145
+
+
+ 4, 4, 4, 4
- 711, 497
+ 948, 612
8
@@ -213,19 +172,79 @@
$this
- 0
+ 3
+
+
+ Verdana, 14.25pt
+
+
+ False
+
+
+ 37, 73
+
+
+ 777, 37
+
+
+ 10
+
+
+ orderComboBox
+
+
+ TBF.UI.Shared.SuggestComboBox, TBF, Version=2.33.2152.0, Culture=neutral, PublicKeyToken=null
+
+
+ $this
+
+
+ 2
+
+
+ True
+
+
+ Verdana, 14.25pt
+
+
+ 32, 32
+
+
+ 83, 29
+
+
+ 11
+
+
+ label1
+
+
+ labelOrder
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 1
True
- 6, 13
+ 8, 16
True
- 769, 639
+ 1025, 786
+
+
+ 4, 4, 4, 4
Batch data
diff --git a/TBF/Rig/DataEntry/iPerl/EntryForm.cs b/TBF/Rig/DataEntry/iPerl/EntryForm.cs
index 51f3dbd92..3a175b684 100644
--- a/TBF/Rig/DataEntry/iPerl/EntryForm.cs
+++ b/TBF/Rig/DataEntry/iPerl/EntryForm.cs
@@ -7,7 +7,6 @@ using log4net;
using Config.Entities;
using TBF.Rig;
using TBF.Rig.GenericDevices;
-using TBF.Rig.Sequences;
namespace TBF.Rig.DataEntry.iPerl
{
@@ -85,7 +84,7 @@ namespace TBF.Rig.DataEntry.iPerl
{
if (currentOp != CurrentOp.None) throw new Exception("Sequence error");
currentOp = CurrentOp.ShowFormAtCycleBeginning;
- this.waterMeters = ProcessData.BatchRslts.Batch.WaterMeters;
+ this.waterMeters = TBF.Rig.Sequences.ProcessData.BatchRslts.Batch.WaterMeters;
return this;
}
@@ -98,10 +97,6 @@ namespace TBF.Rig.DataEntry.iPerl
return this;
}
- /// null (not implemented)
- public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; }
- public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; }
-
/// Reference to the operation
public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi)
{
@@ -118,8 +113,7 @@ namespace TBF.Rig.DataEntry.iPerl
///
void OpenBeginningDlg(EntryForm myRef)
{
- myRef.modelessDlg = new CycleBeginningForm(TBF.Data.WMsCount, myRef.entryFormCfg,
- ProcessData.SelectedProcedure.OrderInfo != null ? ProcessData.SelectedProcedure.OrderInfo.POName : string.Empty);
+ myRef.modelessDlg = new CycleBeginningForm(TBF.Data.WMsCount, myRef.entryFormCfg);
modelessDlg.Show();
}
///
@@ -142,16 +136,7 @@ namespace TBF.Rig.DataEntry.iPerl
switch (currentOp)
{
case CurrentOp.ShowFormAtCycleBeginning:
- if (ProcessData.SelectedProcedure.OrderInfo == null || entryFormCfg.Direction != Direction.S640)
- {
- Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this);
- }
- else
- {
- /// Only in case of 640 meters and an order information entered during the procedure selection
- /// this DataEntry form at the beginning of the cycle is skipped
- modelessDlg = null;
- }
+ Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this);
break;
case CurrentOp.EnterTestStartStates:
Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this);
@@ -166,17 +151,7 @@ namespace TBF.Rig.DataEntry.iPerl
/// Event.ResultsPrinted
public Event Run()
{
- if (ProcessData.SelectedProcedure.OrderInfo != null && entryFormCfg.Direction == Direction.S640)
- {
- for (int i = 0; i < waterMeters.Count; i++)
- {
- if (waterMeters[i] != null)
- waterMeters[i].PurchaseOrder = ProcessData.SelectedProcedure.OrderInfo.POName;
- }
- return Event.ModelessFormClosed;
- }
-
- if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed)
+ if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed)
{
return Event.ModelessFormIsOpen;
}
@@ -239,5 +214,26 @@ namespace TBF.Rig.DataEntry.iPerl
}
currentOp = CurrentOp.None;
}
- }
+
+ public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp = false)
+ {
+ if (currentOp != CurrentOp.None) throw new Exception("Sequence error");
+ currentOp = CurrentOp.EnterTestStartStates;
+ this.regReaders = regReaders;
+ this.waterMeters = waterMeters;
+ // Handle isCondOp if necessary
+ return this;
+ }
+
+ public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi)
+ {
+ if (currentOp != CurrentOp.None) throw new Exception("Sequence error");
+ currentOp = CurrentOp.EnterTestEndStates;
+ this.regReaders = regReaders;
+ this.refVolume = volumeRef;
+ this.errLimLo = errLimLo;
+ this.errLimHi = errLimHi;
+ return this;
+ }
+ }
}
diff --git a/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs b/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs
index 69b9faa07..607318220 100644
--- a/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs
+++ b/TBF/Rig/DataEntry/iPerl/EntryFormCfg.cs
@@ -32,23 +32,17 @@ namespace TBF.Rig.DataEntry.iPerl
public enum Orders
{
#if LANG_SK
- [Description("Ľubovolné")] Arbitrary,
- [Description("Z Oracle databázy")] FromOracle,
- [Description("Zo sledovacej databázy")] FromTracingDB,
- [Description("Združené a z Oracle")] CombinedAndFromOracle,
- [Description("Združené a zo sledovacej databázy")] CombinedAndFromTracingDB,
-#elif LANG_CZ
- [Description("Libovolné")] Arbitrary,
- [Description("Z Oracle databáze")] FromOracle,
- [Description("Ze sledovací databáze")] FromTracingDB,
- [Description("Sdružené a z Oracle")] CombinedAndFromOracle,
- [Description("Sdružené a ze sledovací databáze")] CombinedAndFromTracingDB,
+ [Description("Ľubovolné")] Arbitrary,
+ [Description("Aktívne z Oracle")] FromOracle,
+ [Description("Združené a aktívne z Oracle")] CombinedAndFromOracle,
+#elif LANG_DE
+ [Description("Arbitrary")] Arbitrary,
+ [Description("Active from Oracle")] FromOracle,
+ [Description("Combined and active from Oracle")] CombinedAndFromOracle,
#else
- [Description("Arbitrary")] Arbitrary,
- [Description("From Oracle")] FromOracle,
- [Description("From Tracing DB")] FromTracingDB,
- [Description("Combined and from Oracle")] CombinedAndFromOracle,
- [Description("Combined and from Tracing DB")] CombinedAndFromTracingDB,
+ [Description("Arbitrary")] Arbitrary,
+ [Description("Active from Oracle")] FromOracle,
+ [Description("Combined and active from Oracle")] CombinedAndFromOracle,
#endif
Count,
}
@@ -99,15 +93,22 @@ namespace TBF.Rig.DataEntry.iPerl
public ICollection ParamValues(int i)
{
- var list = new List();
switch (i)
{
case 0:
- for (Direction d = 0; d < Direction.Count; d++) list.Add(d.ToDescription());
- return list;
+ return new string[]
+ {
+ Direction.Forward_RL.ToDescription(),
+ Direction.Reversed_LR.ToDescription(),
+ Direction.S640.ToDescription(),
+ };
case 1:
- for (Orders o = 0; o < Orders.Count; o++) list.Add(o.ToDescription());
- return list;
+ return new string[]
+ {
+ Orders.Arbitrary.ToDescription(),
+ Orders.FromOracle.ToDescription(),
+ Orders.CombinedAndFromOracle.ToDescription(),
+ };
default:
return null;
}
diff --git a/TBF/Rig/DataEntry/iPerl/Factory.cs b/TBF/Rig/DataEntry/iPerl/Factory.cs
index a6a03df6d..9a757e788 100644
--- a/TBF/Rig/DataEntry/iPerl/Factory.cs
+++ b/TBF/Rig/DataEntry/iPerl/Factory.cs
@@ -8,7 +8,7 @@ namespace TBF.Rig.DataEntry.iPerl
{
public class Factory : IComponentFactory
{
- public string ClassName { get { return GetType().Namespace.Substring(8); } }
+ public string ClassName { get { return "DataEntry-iPerl"; } }
public override string ToString() { return ClassName; }
public IComponent DummyComponent() { return new EntryForm(); }
diff --git a/TBF/Rig/Dummy/RegValve/RegValve.cs b/TBF/Rig/Dummy/RegValve/RegValve.cs
index 76a6cad31..d2139793b 100644
--- a/TBF/Rig/Dummy/RegValve/RegValve.cs
+++ b/TBF/Rig/Dummy/RegValve/RegValve.cs
@@ -22,7 +22,8 @@ namespace TBF.Rig.Dummy.RegValve
public bool IsCoax { get { return false; } }
public double Position { get { return 50.0; } }
-
+ ///
+ public int RegulationMinStep { get { return 0; } }
IDictionary dict;
public IDictionary Dict { get { return dict; } }
diff --git a/TBF/Rig/OutputPath.cs b/TBF/Rig/OutputPath.cs
index ea3365fd7..4c932ed1a 100644
--- a/TBF/Rig/OutputPath.cs
+++ b/TBF/Rig/OutputPath.cs
@@ -15,7 +15,8 @@ namespace TBF.Rig
public string Selector;
public IFlowMeter FlowMeter;
public IRegValve RegValve;
- public float PidCoef;
+ public int RegulMinStep;
+ public float PidCoef;
public IDiverter Diverter;
public ITempMeter TempMtrDiv;
public IScaleOrTank Scale;
@@ -39,7 +40,7 @@ namespace TBF.Rig
RegVPositions = new List();
ValvesOpen = new List();
ValvesClose = new List();
- }
+ }
/// Constructor from data entity
public OutputPath(Config.Entities.OutputPath entity, IList components)
@@ -50,7 +51,8 @@ namespace TBF.Rig
Selector = entity.Selector;
FlowMeter = TbfComponents.FindComponent(entity.FlowMeter, components) as IFlowMeter;
RegValve = TbfComponents.FindComponent(entity.RegValve, components) as IRegValve;
- PidCoef = entity.PidCoef;
+ RegulMinStep = entity.RegulMinStep;
+ PidCoef = entity.PidCoef;
Diverter = TbfComponents.FindComponent(entity.Diverter, components) as IDiverter;
TempMtrDiv = TbfComponents.FindComponent(entity.TempMtrDiv, components) as ITempMeter;
Scale = TbfComponents.FindComponent(entity.Scale, components) as IScaleOrTank;
diff --git a/TBF/Rig/Sequences/MainSeq.cs b/TBF/Rig/Sequences/MainSeq.cs
index de6b93b18..664120b5a 100644
--- a/TBF/Rig/Sequences/MainSeq.cs
+++ b/TBF/Rig/Sequences/MainSeq.cs
@@ -18,6 +18,8 @@ using TBF.Rig.Network.RestAPI;
using TBF.Rig.Network.RestAPI.facade;
using TBF.Rig.Output.Printers.GroupPrinting.Single;
using TBF.UiBridge;
+using SharedComponents;
+using System.Text;
namespace TBF.Rig.Sequences
{
@@ -33,6 +35,7 @@ namespace TBF.Rig.Sequences
int simultWithPurgingCount;
Generic.IComponentCfg simultWithPurgingCfg;
+ Generic.IComponent simultWithPurging;
Generic.IProcedureParams simultWithPurgingProcParams;
IList simultWithPurgingTests;
IList simultWithPurgingTestParams;
@@ -44,10 +47,10 @@ namespace TBF.Rig.Sequences
IList simultWithEvacuationTestParams;
System.Windows.Forms.Form modelessDlg;
- ///
- delegate void CommunicationFormDlgt(MainSeq myRef, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams);
///
- void OpenIPerlCommForm(MainSeq myRef, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams)
+ delegate void CommunicationFormDlgt(MainSeq myRef, Generic.IComponent testMethod, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams);
+ ///
+ void OpenIPerlCommForm(MainSeq myRef, Generic.IComponent testMethod, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams)
{
try
{
@@ -60,9 +63,13 @@ namespace TBF.Rig.Sequences
IList iPerlCommParams = new List();
foreach (var tp in multiTestParams) iPerlCommParams.Add(tp as TestMethods.iPerlCommunication.iPerlCommunicationParams);
- myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(iPerlCfg, tests, iPerlCommParams);
- myRef.modelessDlg.Show();
- }
+ /*myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(iPerlCfg, tests, iPerlCommParams);
+ myRef.modelessDlg.Show();*/
+
+ myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(
+ testMethod as TBF.Rig.TestMethods.iPerlCommunication.TestMethod, tests, iPerlCommParams);
+ myRef.modelessDlg.Show();
+ }
catch (Exception e)
{
log.FatalFormat("---------------( MainSeq : OpenIperlCommForm crashed !!! )---------------");
@@ -76,7 +83,7 @@ namespace TBF.Rig.Sequences
}
}
///
- void OpenS640CommForm(MainSeq myRef, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams)
+ void OpenS640CommForm(MainSeq myRef, Generic.IComponent testMethod, Generic.IComponentCfg cfg, Generic.IProcedureParams procParams, IList tests, IList multiTestParams)
{
try
{
@@ -1494,13 +1501,45 @@ namespace TBF.Rig.Sequences
goto error;
}
}
- catch (Exception exc)
+ /*catch (Exception exc)
{
string msg = string.Format("Unable to update Batch.RsltsSent in local MySQL DB, BatchNr = {0}",
ProcessData.BatchRslts.Batch.BatchNr);
Bridge.OnError(this, msg);
log.FatalFormat("{0}: {1}", msg, exc.Message);
goto error;
+ }*/
+ catch (Exception exc)
+ {
+ var batch = ProcessData.BatchRslts.Batch;
+
+ // ⚠️ Skladanie detailného logu do jedného reťazca
+ var logBuilder = new StringBuilder();
+ logBuilder.AppendLine("----------------- Unable to update Batch.RsltsSent in local MySQL DB, BatchNr = {0} ------------------");
+ logBuilder.AppendLine("❌ Chyba pri UPDATE `batch` SET `RsltsSent` = '1'");
+ logBuilder.AppendLine($"BatchNr = {batch.BatchNr}");
+ logBuilder.AppendLine($"SQL príkaz: UPDATE `batch` SET `RsltsSent` = '1' WHERE `batch`.`BatchNr` = {batch.BatchNr};");
+ logBuilder.AppendLine();
+ logBuilder.AppendLine("💥 Výnimka:");
+ logBuilder.AppendLine($" - Message: {exc.Message}");
+ logBuilder.AppendLine($" - StackTrace: {exc.StackTrace}");
+ logBuilder.AppendLine($" - InnerException: {(exc.InnerException != null ? exc.InnerException.Message : "null")}");
+ logBuilder.AppendLine();
+ logBuilder.AppendLine("📦 Batch obsah:");
+
+ // 💡 Dynamický výpis vlastností objektu Batch
+ var props = batch.GetType().GetProperties();
+ foreach (var prop in props)
+ {
+ object value = prop.GetValue(batch, null);
+ logBuilder.AppendLine($" - {prop.Name}: {value}");
+ }
+
+ // ✍️ Uloženie do vlastného logu
+ LiveLogCache.Instance.AddLog(logBuilder.ToString());
+
+ Bridge.OnError(this, "Chyba pri aktualizácii výsledkov v MySQL.");
+ goto error;
}
}
diff --git a/TBF/Rig/Sequences/ProcessData.cs b/TBF/Rig/Sequences/ProcessData.cs
index f4f74888b..105741a3c 100644
--- a/TBF/Rig/Sequences/ProcessData.cs
+++ b/TBF/Rig/Sequences/ProcessData.cs
@@ -26,6 +26,7 @@ namespace TBF.Rig.Sequences
public static IErrorFlags ErrorFlagsComp;
public static IStatisticsMonitoring StatisticsMonitoringComp;
public static Output.DB.SensusOracle.Database OracleDB;
+ public static Output.DB.SensusOracle.OrderDetails OrderDetails;
public static Output.DB.ProductionTracing.Tracing TracingDB;
///
@@ -528,12 +529,14 @@ namespace TBF.Rig.Sequences
StateMachine.ControlBoardMain.TestTime.ToString("F3"),/// test time in s
StateMachine.ControlBoardMain.RefPulses, /// reference flow meter pulses count
outPath.FlowMeter != null ? Formulas.VolumeFromPulses(StateMachine.ControlBoardMain.RefPulses, 1 / outPath.FlowMeter.LtrPerPulse).ToString("F3") : "0.000", /// volume in l
- benchPath.TempMtrUp != null ? benchPath.TempMtrUp.ReadTemperature() : 0, /// temp. at the beginning of line in degree C
+ benchPath.TempMtrUp != null ? benchPath.TempMtrUp.ReadTemperature() : 0, /// temp. at the beginning of line in degree C
benchPath.TempMtrDown != null ? benchPath.TempMtrDown.ReadTemperature() : 0, /// temp. at the end of line in degree C
- outPath.TempMtrDiv != null ? outPath.TempMtrDiv.ReadTemperature() : 0, /// temp. at the diverter in degree C
- PressUp, /// water pressure at the beginning of test line in bar (= 100 kPa)
- PressDown, /// water pressure at the end of test line in bar (= 100 kPa)
- PressDelta,
+ outPath.TempMtrDiv != null ? outPath.TempMtrDiv.ReadTemperature() : 0, /// temp. at the diverter in degree C
+ //---new2
+ PressUp.ToString(), /// water pressure at the beginning of test line in bar (= 100 kPa)
+ PressDown.ToString(), /// water pressure at the end of test line in bar (= 100 kPa)
+ PressDelta.ToString(),
+ //---endnew2
(outPath.Scale is IScale) ? (outPath.Scale as IScale).Mass : 0, /// collected water mass in kg
"VolMM",
AmbTemp, /// ambient temperature in degree C
@@ -561,19 +564,25 @@ namespace TBF.Rig.Sequences
benchPath.TempMtrUp != null ? benchPath.TempMtrUp.ReadTemperature() : 0, /// temp. at the beginning of line in degree C
benchPath.TempMtrDown != null ? benchPath.TempMtrDown.ReadTemperature() : 0, /// temp. at the end of test in degree C
outPath.TempMtrDiv != null ? outPath.TempMtrDiv.ReadTemperature() : 0, /// temp. at the diverter in degree C
- PressUp,
- PressDown,
- PressDelta,
+ //---new2
+ PressUp.ToString(),
+ PressDown.ToString(),
+ PressDelta.ToString(),
+ //---endnew2
(outPath.Scale is IScale) ? (outPath.Scale as IScale).Mass : 0, /// collected water mass in kg
"VolMM",
- AmbTemp,
- AmbHumi,
- AmbPress,
+ //---new2
+ AmbTemp.ToString(),
+ AmbHumi.ToString(),
+ AmbPress.ToString(),
+ //---endnew2
outPath.RegValve.Position.ToString("F1"),
- TempRefHi1,
- TempRefHi2,
- TempRefLo1,
- TempRefLo2);
+ //---new2
+ TempRefHi1.ToString(),
+ TempRefHi2.ToString(),
+ TempRefLo1.ToString(),
+ TempRefLo2.ToString());
+ //---endnew2
}
///
diff --git a/TBF/Rig/TbfComponents.cs b/TBF/Rig/TbfComponents.cs
index 4ef66b2d9..42a9545a1 100644
--- a/TBF/Rig/TbfComponents.cs
+++ b/TBF/Rig/TbfComponents.cs
@@ -133,6 +133,7 @@ namespace TBF.Rig
new RegisterReaders.KPackE.Radio.Factory(), /// Radio for KPackE register readers
new Uni.RegValve.Factory(),
new Uni.RegValveAnalog.Factory(),
+ new Uni.RegValveLowRegulTimeSaturation.Factory(),
new Scales.MettlerToledo.Factory(),
new TestMethods.Adjustment.Factory(),
new TestMethods.ChangeFlowDirection.Factory(),
diff --git a/TBF/Rig/TestMethods/Endurance/CycleDlg.cs b/TBF/Rig/TestMethods/Endurance/CycleDlg.cs
index 08b15c2e1..880b9c1db 100644
--- a/TBF/Rig/TestMethods/Endurance/CycleDlg.cs
+++ b/TBF/Rig/TestMethods/Endurance/CycleDlg.cs
@@ -28,7 +28,7 @@ namespace TBF.Rig.TestMethods.Endurance
/// Auxiliary public lists used also by user controls in tab pages
public IList TbfComponents;
- public IList Valves;
+ public IList Valves = new List();
ITabWithListViewEx seqStepsCtrl;
@@ -39,8 +39,9 @@ namespace TBF.Rig.TestMethods.Endurance
EnduranceCycle = new List();
}
- public CycleDlg(IList cycle)
+ public CycleDlg(IList cycle, IList valves)
{
+ this.Valves = valves;
/// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi.
Dpi = (int)this.CreateGraphics().DpiX;
@@ -64,25 +65,9 @@ namespace TBF.Rig.TestMethods.Endurance
seqStepsCtrl = new CycleStepsCtrl() as ITabWithListViewEx;
/// Prepare a list of valves for the endurance test
+ /// ... list is set by user
- /// Load the list of components from the database
- NHibernate.ISession session = TBF.DB.CreateSession(DBKind.Config);
- var cmptnEntities = session.QueryOver().OrderBy(x => x.ItemNr).Asc .List();
- TbfComponents = TBF.Rig.TbfComponents.LoadComponentsFromDB(cmptnEntities);
- Valves = new List();
- for (int bitNr = 0; bitNr < 8; bitNr++)
- {
- foreach (var vlv in TbfComponents)
- {
- if (vlv is TBF.Rig.BuiltIn.Valve.Valve && (vlv as TBF.Rig.BuiltIn.Valve.Valve).BitPosition == bitNr)
- {
- Valves.Add(vlv as IValve);
- break;
- }
- }
- }
-
- EnduranceCycle = (cycle != null) ? cycle : new List(); /// TODO: Load from component parameters
+ EnduranceCycle = (cycle != null) ? cycle : new List(); /// TODO: Load from component parameters
/// Create a tab with sequence steps for each sequence ordered by ItemNr.
AddCycleStepsTab(EnduranceCycle);
diff --git a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs
index 181483b2c..cf5e15523 100644
--- a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs
+++ b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.cs
@@ -2,17 +2,28 @@
/// Copyright (c) 2016 Sensus Metering Systems
///
using System;
+using System.Collections.Generic;
using System.Windows.Forms;
+using System.Windows.Forms.VisualStyles;
+using TBF.Resources;
+using TBF.Rig.Generic;
+using TBF.Rig.GenericDevices;
using Common;
using Config.Entities;
-using TBF.Rig.Generic;
-using TBF.Resources;
+
+using System.Linq;
+using TBF.Rig.Sequences;
+
+using NHibernate;
+using log4net;
namespace TBF.Rig.TestMethods.Endurance
{
public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl
{
- public bool ShowMore { get { return false; } }
+ IList valvesFromDB = new List();
+
+ public bool ShowMore { get { return false; } }
string cycle;
@@ -30,7 +41,9 @@ namespace TBF.Rig.TestMethods.Endurance
public TestMethodCfgCtrl()
{
InitializeComponent();
- }
+ valvesFromDB = LoadValvesFromDB();
+ CreateValveRows(valvesFromDB.Count, valvesFromDB); // toľko riadkov, koľko ventilov
+ }
private void EntryFormCfgCtrl_Load(object sender, EventArgs e)
{
@@ -76,11 +89,109 @@ namespace TBF.Rig.TestMethods.Endurance
private void enduranceCycleButton_Click(object sender, EventArgs e)
{
- CycleDlg dlg = new CycleDlg(CycleStep.StringToCycle(cycle));
+ CycleDlg dlg = new CycleDlg(CycleStep.StringToCycle(cycle), GetSelectedValves());
if (dlg.ShowDialog() == DialogResult.OK)
{
cycle = CycleStep.CycleToString(dlg.EnduranceCycle);
}
}
- }
+ private void CreateValveRows(int numberOfRows, IList valves)
+ {
+ tableLayoutPanel1.RowCount = numberOfRows;
+ tableLayoutPanel1.ColumnCount = 2;
+
+ tableLayoutPanel1.Controls.Clear();
+ tableLayoutPanel1.ColumnStyles.Clear();
+ tableLayoutPanel1.RowStyles.Clear();
+
+ tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
+ tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
+
+ for (int i = 0; i < numberOfRows; i++)
+ {
+ tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
+
+ var label = new Label
+ {
+ Text = $"Valve {i + 1}",
+ Anchor = AnchorStyles.Left,
+ AutoSize = true,
+ Margin = new Padding(5)
+ };
+
+ var comboBox = new ComboBox
+ {
+ DropDownStyle = ComboBoxStyle.DropDownList,
+ Anchor = AnchorStyles.Left | AnchorStyles.Right,
+ Dock = DockStyle.Fill,
+ Margin = new Padding(5),
+ Name = $"comboValve{i + 1}",
+ DisplayMember = "Name" // zobrazenie názvu ventilu
+ };
+
+ comboBox.Items.Add("None");
+
+ foreach (var valve in valves)
+ {
+ comboBox.Items.Add(valve.Name/* + " (bit nr = " + valve.BitPosition + ")"*/);
+ }
+
+ comboBox.SelectedIndex = 0;
+
+ tableLayoutPanel1.Controls.Add(label, 0, i);
+ tableLayoutPanel1.Controls.Add(comboBox, 1, i);
+ }
+ }
+
+
+ private IList LoadValvesFromDB()
+ {
+ /// Load the list of components from the database
+ IList valves = new List();
+
+ using (NHibernate.ISession session = TBF.DB.CreateSession(DBKind.Config))
+ {
+ IList TbfComponents = Rig.TbfComponents.LoadComponentsFromDB(session);
+ valves = getAllValves(TbfComponents);
+
+ }
+ /// Find all master valvesFromDB
+ return valves;
+ }
+
+ ///
+ /// Process the list of components and return all valvesFromDB (masters and coupled)
+ ///
+ public static IList getAllValves(IList cmpnts)
+ {
+ IList result = new List();
+ foreach (var cmpnt in cmpnts) if (cmpnt is Rig.BuiltIn.Valve.Valve) result.Add(cmpnt as Rig.BuiltIn.Valve.Valve);
+ return result;
+ }
+
+ private List GetSelectedValves()
+ {
+ var selectedValves = new List();
+
+ foreach (Control control in tableLayoutPanel1.Controls)
+ {
+ if (control is ComboBox comboBox)
+ {
+ var selectedName = comboBox.SelectedItem?.ToString();
+
+ if (!string.IsNullOrEmpty(selectedName) && selectedName != "None")
+ {
+ // Nájdeme ventil podľa mena v zozname všetkých
+ var valve = valvesFromDB.FirstOrDefault(v => v.Name == selectedName);
+ if (valve != null)
+ {
+ selectedValves.Add(valve);
+ }
+ }
+ }
+ }
+
+ return selectedValves;
+ }
+ }
}
diff --git a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs
index 16d855bae..90107e515 100644
--- a/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs
+++ b/TBF/Rig/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs
@@ -31,62 +31,85 @@ namespace TBF.Rig.TestMethods.Endurance
///
private void InitializeComponent()
{
- this.nameTextBox = new System.Windows.Forms.TextBox();
- this.nameLabel = new System.Windows.Forms.Label();
- this.classNameLabel = new System.Windows.Forms.Label();
- this.enduranceCycleButton = new System.Windows.Forms.Button();
- this.SuspendLayout();
- //
- // nameTextBox
- //
- this.nameTextBox.Enabled = false;
- this.nameTextBox.Location = new System.Drawing.Point(137, 57);
- this.nameTextBox.Name = "nameTextBox";
- this.nameTextBox.Size = new System.Drawing.Size(130, 20);
- this.nameTextBox.TabIndex = 5;
- //
- // nameLabel
- //
- this.nameLabel.AutoSize = true;
- this.nameLabel.Location = new System.Drawing.Point(27, 60);
- this.nameLabel.Name = "nameLabel";
- this.nameLabel.Size = new System.Drawing.Size(35, 13);
- this.nameLabel.TabIndex = 4;
- this.nameLabel.Text = "Name";
- //
- // classNameLabel
- //
- this.classNameLabel.AutoSize = true;
- this.classNameLabel.Location = new System.Drawing.Point(134, 33);
- this.classNameLabel.Name = "classNameLabel";
- this.classNameLabel.Size = new System.Drawing.Size(83, 13);
- this.classNameLabel.TabIndex = 3;
- this.classNameLabel.Text = "ComonentName";
- //
- // enduranceCycleButton
- //
- this.enduranceCycleButton.Enabled = false;
- this.enduranceCycleButton.Location = new System.Drawing.Point(137, 83);
- this.enduranceCycleButton.Name = "enduranceCycleButton";
- this.enduranceCycleButton.Size = new System.Drawing.Size(130, 31);
- this.enduranceCycleButton.TabIndex = 6;
- this.enduranceCycleButton.Text = "Endurance cycle";
- this.enduranceCycleButton.UseVisualStyleBackColor = true;
- this.enduranceCycleButton.Click += new System.EventHandler(this.enduranceCycleButton_Click);
- //
- // TestMethodCfgCtrl
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.enduranceCycleButton);
- this.Controls.Add(this.nameTextBox);
- this.Controls.Add(this.nameLabel);
- this.Controls.Add(this.classNameLabel);
- this.Name = "TestMethodCfgCtrl";
- this.Size = new System.Drawing.Size(300, 200);
- this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load);
- this.ResumeLayout(false);
- this.PerformLayout();
+ this.nameTextBox = new System.Windows.Forms.TextBox();
+ this.nameLabel = new System.Windows.Forms.Label();
+ this.classNameLabel = new System.Windows.Forms.Label();
+ this.enduranceCycleButton = new System.Windows.Forms.Button();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.SuspendLayout();
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Enabled = false;
+ this.nameTextBox.Location = new System.Drawing.Point(137, 57);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.Size = new System.Drawing.Size(130, 20);
+ this.nameTextBox.TabIndex = 5;
+ //
+ // nameLabel
+ //
+ this.nameLabel.AutoSize = true;
+ this.nameLabel.Location = new System.Drawing.Point(27, 60);
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Size = new System.Drawing.Size(35, 13);
+ this.nameLabel.TabIndex = 4;
+ this.nameLabel.Text = "Name";
+ //
+ // classNameLabel
+ //
+ this.classNameLabel.AutoSize = true;
+ this.classNameLabel.Location = new System.Drawing.Point(134, 33);
+ this.classNameLabel.Name = "classNameLabel";
+ this.classNameLabel.Size = new System.Drawing.Size(83, 13);
+ this.classNameLabel.TabIndex = 3;
+ this.classNameLabel.Text = "ComonentName";
+ //
+ // enduranceCycleButton
+ //
+ this.enduranceCycleButton.Enabled = false;
+ this.enduranceCycleButton.Location = new System.Drawing.Point(137, 83);
+ this.enduranceCycleButton.Name = "enduranceCycleButton";
+ this.enduranceCycleButton.Size = new System.Drawing.Size(130, 31);
+ this.enduranceCycleButton.TabIndex = 6;
+ this.enduranceCycleButton.Text = "Endurance cycle";
+ this.enduranceCycleButton.UseVisualStyleBackColor = true;
+ this.enduranceCycleButton.Click += new System.EventHandler(this.enduranceCycleButton_Click);
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.AutoSize = true;
+ this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.tableLayoutPanel1.ColumnCount = 2;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 37.5F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 62.5F));
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(30, 120);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 8;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(0, 120);
+ this.tableLayoutPanel1.TabIndex = 8;
+ //
+ // TestMethodCfgCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Controls.Add(this.enduranceCycleButton);
+ this.Controls.Add(this.nameTextBox);
+ this.Controls.Add(this.nameLabel);
+ this.Controls.Add(this.classNameLabel);
+ this.Name = "TestMethodCfgCtrl";
+ this.Size = new System.Drawing.Size(300, 502);
+ this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
}
@@ -96,5 +119,6 @@ namespace TBF.Rig.TestMethods.Endurance
private System.Windows.Forms.Label nameLabel;
private System.Windows.Forms.Label classNameLabel;
private System.Windows.Forms.Button enduranceCycleButton;
- }
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ }
}
diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs
index 283c63d8c..4667286e4 100644
--- a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs
+++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs
@@ -224,7 +224,7 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection
///
State.Create(string.Format("{0}({1}) : Starting pump {2}", test.Method, test.Name, (inPath.Pump != null) ? inPath.Pump.Name : "?"))
.AddOperation(checkUiOp)
-// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60))
+// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60))
.AddOperations(readTempPressOps)
.AddOperation(heatMetersPromptOp)
.AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null)
diff --git a/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs b/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs
index 037b29da6..876b5ae2d 100644
--- a/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs
+++ b/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs
@@ -11,6 +11,7 @@ using TBF.Rig;
using TBF.Boxes;
using TBF.Resources;
using TBF.UiBridge;
+//using AppDiagnostic;
namespace TBF.Rig.TestMethods.PMaxTest
{
@@ -189,6 +190,16 @@ namespace TBF.Rig.TestMethods.PMaxTest
LogProcessDataHeader(processDataLogger, "Starting the test");
+
+ /*//---new1
+ LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name);
+
+ if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass");
+ else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass");
+ //---endNew1*/
+
+ //DiagApi.addLog();
+
State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name))
.AddOperation(checkUiOp)
.AddOperations(readTempPressOps)
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs b/TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs
new file mode 100644
index 000000000..3edaced4e
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/OpticalHeadTest.cs
@@ -0,0 +1,131 @@
+using Config.Resources;
+using log4net;
+using Sensus.iPerl.RfidCom.Helper;
+using Sensus.iPerl.RfidCom.Services;
+using Sensus.iPerl.RfidCom.Structures;
+using System;
+using System.Threading;
+using TBF.Rig.Hart.Common;
+using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
+using static Sensus.iPerl.NfcHandler.MCI_Protocol;
+
+namespace TBF.Rig.TestMethods.iPerlCommunication
+{
+ internal class OpticalHeadTest
+ {
+ protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
+
+ internal static string OpenSealing(IperlHead iHead)
+ {
+ if (RfidCommands.OpenSealing($"COM{iHead.RfidComPortNr}")) return "OK";
+ return "Error Open Sealing";
+ }
+
+ internal static string ReadRequest_PCB(IperlHead iHead)
+ {
+ try
+ {
+ byte[] pcb = null;
+ int readRetVal = iPerlCommunicationForm.ReadRequestPort(iHead, MessageID.Configuration, Sensus.iPerl.NfcHandler.MCI_Protocol.StructName.Configuration, 16, 5, out pcb);
+ if (readRetVal == 0)
+ {
+ return RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(BitConverter.ToString(pcb).Replace("-", string.Empty))).ToString();
+ }
+ rfidDataLogger.Error($"COM{iHead.RfidComPortNr}: ReadRequest_PCB ({MessageID.Configuration},16,5...) <- Error: {readRetVal}");
+ return "Error";
+ }
+ catch (Exception ex)
+ {
+ return (ex.Message.ToString());
+ }
+ }
+
+ internal static string SetActiveMode(IperlHead iHead)
+ {
+ byte[] cmd = new byte[1] { (byte)Command.SetActiveMode };
+ if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd))
+ {
+ return "OK";
+ }
+ else
+ {
+ return "Error Set Active Mode";
+ }
+ }
+
+ internal static string SetTestMode(IperlHead iHead)
+ {
+ byte[] cmd = new byte[1] { (byte)Command.SetTestMode };
+ if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd))
+ {
+ return "OK";
+ }
+ else
+ {
+ return "Error Set Test Mode";
+ }
+ }
+
+#if IPERL
+ internal static string TurnOffRadio(IperlHead iHead)
+ {
+ try
+ {
+ int retValue = iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, 1, new byte[] { (byte)3 }); // WakeUpInterval
+ return 0 == retValue ? "OK" : "Error";
+ }
+ catch (Exception ex)
+ {
+ return (ex.Message.ToString());
+ }
+ }
+
+ internal static string SetProductionMode(IperlHead iHead)
+ {
+ try
+ {
+ int retValue = iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, 1, new byte[] { (byte)1 }); // System Status
+ return 0 == retValue ? "OK" : "Error";
+ }
+ catch (Exception ex)
+ {
+ return (ex.Message.ToString());
+ }
+ }
+
+ internal static string WriteRequestPort_u8_Customer_Text(IperlHead iHead)
+ {
+ string custText = "FF0123456789ABCDEF"; // Sample text to test write function
+ /*try
+ {
+ byte[] cmd = RfidHelper.HexStringToByteArray(custText);
+ if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, Sensus.iPerl.NfcHandler.MCI_Protocol.StructName.RadioParams, 0x1899, 9, cmd))
+ {
+ RfidCommunicationService rfidCommunicationService = new RfidCommunicationService { ComPort = $"COM{iHead.RfidComPortNr}", WaitTimeAfterFailure = 2200, PassThroughWaitTime = 1500, MaxRetries = 3, TimeOut = 5000 };
+ //rfidCommunicationService.RfidWrite(Params.u8_Customer_Text, custText);
+ return rfidCommunicationService.RfidRead(Params.u8_Customer_Text).ToString();
+ }
+ }
+ catch (Exception ex)
+ {
+ return (ex.Message.ToString());
+ }*/
+ return $"Error COM{iHead.RfidComPortNr}";
+ }
+
+ internal static string SetRfidMode(IperlHead iHead)
+ {
+ iHead.SetRfidInterface();
+ iHead.SetCommunicationInterface(CommunicationInterface.RFID);
+ return ($"OK - {Strings.Program_restart_is_required_to_apply_some_settings}");
+ }
+
+ internal static string SetNfcMode(IperlHead iHead)
+ {
+ iHead.SetNfcInterface();
+ iHead.SetCommunicationInterface(CommunicationInterface.NFC);
+ return ($"OK - {Strings.Program_restart_is_required_to_apply_some_settings}");
+ }
+#endif /// IPERL
+ }
+}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs b/TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs
new file mode 100644
index 000000000..cc9319161
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/SequenceConditionOp.cs
@@ -0,0 +1,44 @@
+///
+/// Copyright (c) 2022 Sensus Slovensko a.s.
+///
+using TBF.Resources;
+
+namespace TBF.Rig.TestMethods.iPerlCommunication
+{
+ public enum ConditionID
+ {
+ A,
+ B,
+ C,
+ Count,
+ }
+
+ public class SequenceConditionOp : IOperation
+ {
+ public const string ConditionNameFmt = "iPERL communication milestone {0}";
+
+ ConditionID id;
+ TestMethod testMethodComponent;
+
+ public SequenceConditionOp(TestMethod testMethodComponent, ConditionID id)
+ {
+ this.testMethodComponent = testMethodComponent;
+ this.id = id;
+ }
+
+ public void Start() { }
+
+ public Event Run()
+ {
+ bool conditionMet = testMethodComponent.IperlCommMilestone[(int)id];
+ return conditionMet ? Event.ConditionMet : Event.ConditionNotMet;
+ }
+
+ public void Stop() { }
+
+ public override string ToString()
+ {
+ return string.Format(ConditionNameFmt, id);
+ }
+ }
+}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs b/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs
index db1790ef9..9e8168dc5 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/TestMethod.cs
@@ -1,19 +1,18 @@
///
-/// Copyright (c) 2015-2021 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2022 Sensus Slovensko a.s.
///
using System;
-using System.IO.Ports;
using System.Collections.Generic;
using log4net;
using Common;
using Config.Entities;
-using TBF.Rig;
+using TBF.Rig.GenericDevices;
using TBF.Rig.Sequences;
using TBF.UiBridge;
namespace TBF.Rig.TestMethods.iPerlCommunication
{
- public class TestMethod : ComponentBase, GenericDevices.ISimultTestMethod
+ public class TestMethod : ComponentBase, ISimultTestMethod, ISequenceCondition, ISessionDataMngmnt
{
private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod));
protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
@@ -22,12 +21,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; }
public bool DoTransitions() { return false; }
- public bool CheckDeviceCaps(Test test, OutputPath devices, out string message)
- {
- message = string.Format("{0}: CheckDeviceCaps() is not implemented yet", Name);
- return false;
- }
-
public bool SimultWithPrevious { get { return testMethodCfg.TestParams.SimultWithPrevious; } }
public bool SimultWithNext { get { return testMethodCfg.TestParams.SimultWithNext; } }
@@ -68,14 +61,32 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
readonly TestMethodCfg testMethodCfg;
+
+ public bool[] IperlCommMilestone;
+ IList sequenceConditionOps;
- public TestMethod() { }
+ public TestMethod()
+ {
+ CreateMilestonesAndConditions();
+ }
public TestMethod(Generic.IComponentCfg cfg)
: base(cfg)
{
testMethodCfg = cfg as TestMethodCfg;
- }
+ CreateMilestonesAndConditions();
+ }
+
+ void CreateMilestonesAndConditions()
+ {
+ IperlCommMilestone = new bool[(int)ConditionID.Count];
+
+ sequenceConditionOps = new List();
+ for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++)
+ {
+ sequenceConditionOps.Add(new SequenceConditionOp(this, id));
+ }
+ }
/// IDevice interface - only Initialize() is used
public override void Initialize()
@@ -97,16 +108,60 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
{
if (DebugLevel == DebugMode.Normal)
{
- return (new iPerlCommunicationSeq()).Execute(test, repetNr, testMethodCfg, testMethodCfg.TestParams);
+ return (new iPerlCommunicationSeq()).Execute(test, repetNr, this, testMethodCfg.TestParams);
}
else
{
/// DebugLevel == DebugMode.Simulate
(new iPerlCommunicationSeq()).MakeSimulatedTrivial(test, repetNr, test.Part);
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Progress.Completed));
- Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0)));
+ Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Common.Utils.GetTestName(test.Name, 1, 1), 0)));
return new List { Event.Done };
}
}
- }
+
+
+ public int ConditionsCount { get { return (int)ConditionID.Count; } }
+
+ public string ConditionName(int i)
+ {
+ return (i >= 0 && i < (int)ConditionID.Count) ? ConditionOp(i).ToString() : string.Empty;
+ }
+
+ public IOperation ConditionOp(int i)
+ {
+ return (i >= 0 && i < (int)ConditionID.Count) ? sequenceConditionOps[i] : null;
+ }
+
+
+ public void StartSession()
+ {
+ /// Clear milestones
+ if (IperlCommMilestone != null)
+ {
+ for (int i = 0; i < IperlCommMilestone.Length; i++)
+ {
+ IperlCommMilestone[i] = false;
+ }
+ }
+ }
+
+ public void SaveMark(object o)
+ {
+ /// No marks
+ }
+
+ public void EndSession()
+ {
+ /// Nothing at the end of session
+ }
+
+ public bool CheckDeviceCaps(Test test, OutputPath devices, out string message)
+ {
+ // Implement the method to satisfy the ITestMethod interface.
+ // For now, provide a basic implementation.
+ message = "Device capabilities check not implemented.";
+ return true;
+ }
+ }
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs
index 971cea8b5..0ba33468d 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodCfg.cs
@@ -2,6 +2,8 @@
/// Copyright (c) 2015-2021 Sensus Slovensko a.s.
///
using System.Collections.Generic;
+using System.IO.Ports;
+using System.Threading;
using System.Xml.Serialization;
using Common;
using Config.Entities;
@@ -22,9 +24,20 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public int CommTimeout; /// Communication timeout in ms (500 .. 5000)
public int DelayBetweenRetries; /// Delay between communication retries in ms (0 .. 5000)
public int MaxCommRetries; /// Max. number of retries (1 .. 10)
+ public int WaitTimeAfterFailure; /// Wait time after communication failure in ms
+ public int PassThroughWaitTime; /// Pass Through wait time for radio parameters in ms
public int NrThreads; /// Numbwr of parallel threads (1, 2 or 4)
public int IperlCheckErrorsToStop;
+ ///
+ /// NFC S4.5 Combihead params
+ ///
+ public int MciTimeoutMs;
+ public int BaudRate;
+ public int DataBits;
+ public Parity ParityBit;
+ public StopBits StopBits;
+
public int DfltQ2c_15_rl;
public int DfltQ2c_15_lr;
public int DfltQ2c_20_rl;
@@ -59,10 +72,17 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
ParentName = string.Empty;
CommTimeout = 1800; /// ms
MaxCommRetries = 4;
- NrThreads = 2; /// 1, 2 or 4 threads
+ WaitTimeAfterFailure = 2200;
+ PassThroughWaitTime = 1500;
+ NrThreads = 2; /// 1, 2 or 4 threads
IperlCheckErrorsToStop = 10;
+ MciTimeoutMs = 4000; // ms, NFC interface
+ BaudRate = 57600; // NFC Interface
+ DataBits = 8; // NFC Interface
+ ParityBit = Parity.None; // NFC Interface
+ StopBits = StopBits.Two; // NFC Interface
- TestParams = CreateTestParamsProvider() as iPerlCommunicationParams;
+ TestParams = CreateTestParamsProvider() as iPerlCommunicationParams;
}
public TestMethodCfg(IComponentFactory factory)
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs
index 4b49c83a5..d72ececac 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/TestMethodFactory.cs
@@ -9,7 +9,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public class TestMethodFactory : IComponentFactory
{
public string ClassName { get { return GetType().Namespace.Substring(8); } }
- public override string ToString() { return ClassName; }
public IComponent DummyComponent() { return new TestMethod(); }
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
index 5f824ea82..d258eb99e 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2015-2021 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2023 Sensus Slovensko a.s.
///
//#define VERIFY_ACTIVE_MODE
//#define VERIFY_Q2_CORR_RESET
@@ -8,8 +8,7 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
-using System.Runtime.InteropServices;
-using System.Text;
+using System.Linq;
using System.Threading;
using System.Windows.Forms;
using log4net;
@@ -18,6 +17,9 @@ using Config.Entities;
using TBF.Resources;
using TBF.Rig.Sequences;
using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
+using Results.Entities;
+using static Sensus.iPerl.NfcHandler.MCI_Protocol;
+using System.Threading.Tasks;
namespace TBF.Rig.TestMethods.iPerlCommunication
{
@@ -70,26 +72,31 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public const string ResetQ2CorrectionStr = "Reset Q2 correction";
public const string WriteDefaultQ2CorrectionsStr = "Write default Q2 corrections";
public const string InitOrReadQ2CorrectionsStr = "Init or read Q2 corrections";
- public const string WriteQ2CorrectionStr = "Write Q2 correction"; /// No arguments
- public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt"; /// No arguments
- public const string WriteQ2CorrectionGreeceStr = "Write Q2 correction Greece"; /// Arguments: test_name
- public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name
- public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name
- public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments
- public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments
- public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name
- public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name
- public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name
- public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments
- public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments
- public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name
- public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name
- public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name
- public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name
+ public const string WriteQ2CorrectionStr = "Write Q2 correction"; /// No arguments
+ public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt"; /// No arguments
+ public const string WriteQ2CorrectionGreeceStr = "Write Q2 correction Greece"; /// Arguments: test_name
+ public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name
+ public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name
+ public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments
+ public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments
+ public const string WriteQ2CorrectionPlusIncl05Str = "Write_Q2_correction_plus_incl.-0,5..0,5%"; /// No arguments
+ public const string WriteQ2CorrectionPlusAltIncl05Str = "Write_Q2_correction_plus_Alt_incl.-0,5..0,5%"; /// No arguments
+ public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name
+ public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name
+ public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name
+ public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments
+ public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments
+ public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name
+ public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name
+ public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name
+ public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name
public const string Reset2HzCorrectionStr = "Reset 2Hz correction";
public const string Write2HzCorrectionStr = "Write 2Hz correction";
public const string DewaReworkRLStr = "DEWA rework R-L";
public const string DewaReworkLRStr = "DEWA rework L-R";
+ public const string StartTestingSealedMetersStr = "Start testing sealed meters";
+ public const string EndTestingSealedMetersStr = "End testing sealed meters";
+ public const string SimulateCmd = "simulate ";
public static Color DisabledColor = Color.DarkGray;
public static Color OptoAndDirOKColor = Color.Green;
@@ -97,574 +104,60 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public static Color DirNokColor = Color.Red;
- #region DLL_Interface
-
- [DllImport("libRfid1.dll", EntryPoint = "getDllVersion")] static extern unsafe int getDllVersion1();
- [DllImport("libRfid1.dll", EntryPoint = "openPort")] static extern unsafe int openPort1(int comPort);
- [DllImport("libRfid1.dll", EntryPoint = "closePort")] static extern unsafe int closePort1();
- [DllImport("libRfid1.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort1(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid1.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort1(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid2.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion2();
- [DllImport("libRfid2.dll", EntryPoint = "openPort")] static extern unsafe int openPort2(int comPort);
- [DllImport("libRfid2.dll", EntryPoint = "closePort")] static extern unsafe int closePort2();
- [DllImport("libRfid2.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort2(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid2.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort2(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid3.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion3();
- [DllImport("libRfid3.dll", EntryPoint = "openPort")] static extern unsafe int openPort3(int comPort);
- [DllImport("libRfid3.dll", EntryPoint = "closePort")] static extern unsafe int closePort3();
- [DllImport("libRfid3.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort3(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid3.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort3(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid4.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion4();
- [DllImport("libRfid4.dll", EntryPoint = "openPort")] static extern unsafe int openPort4(int comPort);
- [DllImport("libRfid4.dll", EntryPoint = "closePort")] static extern unsafe int closePort4();
- [DllImport("libRfid4.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort4(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid4.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort4(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid5.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion5();
- [DllImport("libRfid5.dll", EntryPoint = "openPort")] static extern unsafe int openPort5(int comPort);
- [DllImport("libRfid5.dll", EntryPoint = "closePort")] static extern unsafe int closePort5();
- [DllImport("libRfid5.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort5(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid5.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort5(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid6.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion6();
- [DllImport("libRfid6.dll", EntryPoint = "openPort")] static extern unsafe int openPort6(int comPort);
- [DllImport("libRfid6.dll", EntryPoint = "closePort")] static extern unsafe int closePort6();
- [DllImport("libRfid6.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort6(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid6.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort6(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid7.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion7();
- [DllImport("libRfid7.dll", EntryPoint = "openPort")] static extern unsafe int openPort7(int comPort);
- [DllImport("libRfid7.dll", EntryPoint = "closePort")] static extern unsafe int closePort7();
- [DllImport("libRfid7.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort7(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid7.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort7(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid8.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion8();
- [DllImport("libRfid8.dll", EntryPoint = "openPort")] static extern unsafe int openPort8(int comPort);
- [DllImport("libRfid8.dll", EntryPoint = "closePort")] static extern unsafe int closePort8();
- [DllImport("libRfid8.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort8(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid8.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort8(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid9.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion9();
- [DllImport("libRfid9.dll", EntryPoint = "openPort")] static extern unsafe int openPort9(int comPort);
- [DllImport("libRfid9.dll", EntryPoint = "closePort")] static extern unsafe int closePort9();
- [DllImport("libRfid9.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort9(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid9.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort9(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid10.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion10();
- [DllImport("libRfid10.dll", EntryPoint = "openPort")] static extern unsafe int openPort10(int comPort);
- [DllImport("libRfid10.dll", EntryPoint = "closePort")] static extern unsafe int closePort10();
- [DllImport("libRfid10.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort10(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid10.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort10(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid11.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion11();
- [DllImport("libRfid11.dll", EntryPoint = "openPort")] static extern unsafe int openPort11(int comPort);
- [DllImport("libRfid11.dll", EntryPoint = "closePort")] static extern unsafe int closePort11();
- [DllImport("libRfid11.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort11(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid11.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort11(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid12.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion12();
- [DllImport("libRfid12.dll", EntryPoint = "openPort")] static extern unsafe int openPort12(int comPort);
- [DllImport("libRfid12.dll", EntryPoint = "closePort")] static extern unsafe int closePort12();
- [DllImport("libRfid12.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort12(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid12.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort12(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid13.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion13();
- [DllImport("libRfid13.dll", EntryPoint = "openPort")] static extern unsafe int openPort13(int comPort);
- [DllImport("libRfid13.dll", EntryPoint = "closePort")] static extern unsafe int closePort13();
- [DllImport("libRfid13.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort13(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid13.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort13(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid14.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion14();
- [DllImport("libRfid14.dll", EntryPoint = "openPort")] static extern unsafe int openPort14(int comPort);
- [DllImport("libRfid14.dll", EntryPoint = "closePort")] static extern unsafe int closePort14();
- [DllImport("libRfid14.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort14(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid14.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort14(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid15.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion15();
- [DllImport("libRfid15.dll", EntryPoint = "openPort")] static extern unsafe int openPort15(int comPort);
- [DllImport("libRfid15.dll", EntryPoint = "closePort")] static extern unsafe int closePort15();
- [DllImport("libRfid15.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort15(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid15.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort15(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid16.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion16();
- [DllImport("libRfid16.dll", EntryPoint = "openPort")] static extern unsafe int openPort16(int comPort);
- [DllImport("libRfid16.dll", EntryPoint = "closePort")] static extern unsafe int closePort16();
- [DllImport("libRfid16.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort16(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid16.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort16(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid17.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion17();
- [DllImport("libRfid17.dll", EntryPoint = "openPort")] static extern unsafe int openPort17(int comPort);
- [DllImport("libRfid17.dll", EntryPoint = "closePort")] static extern unsafe int closePort17();
- [DllImport("libRfid17.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort17(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid17.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort17(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid18.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion18();
- [DllImport("libRfid18.dll", EntryPoint = "openPort")] static extern unsafe int openPort18(int comPort);
- [DllImport("libRfid18.dll", EntryPoint = "closePort")] static extern unsafe int closePort18();
- [DllImport("libRfid18.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort18(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid18.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort18(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid19.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion19();
- [DllImport("libRfid19.dll", EntryPoint = "openPort")] static extern unsafe int openPort19(int comPort);
- [DllImport("libRfid19.dll", EntryPoint = "closePort")] static extern unsafe int closePort19();
- [DllImport("libRfid19.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort19(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid19.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort19(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid20.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion20();
- [DllImport("libRfid20.dll", EntryPoint = "openPort")] static extern unsafe int openPort20(int comPort);
- [DllImport("libRfid20.dll", EntryPoint = "closePort")] static extern unsafe int closePort20();
- [DllImport("libRfid20.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort20(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid20.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort20(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid21.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion21();
- [DllImport("libRfid21.dll", EntryPoint = "openPort")] static extern unsafe int openPort21(int comPort);
- [DllImport("libRfid21.dll", EntryPoint = "closePort")] static extern unsafe int closePort21();
- [DllImport("libRfid21.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort21(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid21.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort21(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid22.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion22();
- [DllImport("libRfid22.dll", EntryPoint = "openPort")] static extern unsafe int openPort22(int comPort);
- [DllImport("libRfid22.dll", EntryPoint = "closePort")] static extern unsafe int closePort22();
- [DllImport("libRfid22.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort22(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid22.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort22(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid23.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion23();
- [DllImport("libRfid23.dll", EntryPoint = "openPort")] static extern unsafe int openPort23(int comPort);
- [DllImport("libRfid23.dll", EntryPoint = "closePort")] static extern unsafe int closePort23();
- [DllImport("libRfid23.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort23(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid23.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort23(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid24.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion24();
- [DllImport("libRfid24.dll", EntryPoint = "openPort")] static extern unsafe int openPort24(int comPort);
- [DllImport("libRfid24.dll", EntryPoint = "closePort")] static extern unsafe int closePort24();
- [DllImport("libRfid24.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort24(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid24.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort24(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid25.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion25();
- [DllImport("libRfid25.dll", EntryPoint = "openPort")] static extern unsafe int openPort25(int comPort);
- [DllImport("libRfid25.dll", EntryPoint = "closePort")] static extern unsafe int closePort25();
- [DllImport("libRfid25.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort25(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid25.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort25(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid26.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion26();
- [DllImport("libRfid26.dll", EntryPoint = "openPort")] static extern unsafe int openPort26(int comPort);
- [DllImport("libRfid26.dll", EntryPoint = "closePort")] static extern unsafe int closePort26();
- [DllImport("libRfid26.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort26(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid26.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort26(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid27.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion27();
- [DllImport("libRfid27.dll", EntryPoint = "openPort")] static extern unsafe int openPort27(int comPort);
- [DllImport("libRfid27.dll", EntryPoint = "closePort")] static extern unsafe int closePort27();
- [DllImport("libRfid27.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort27(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid27.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort27(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid28.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion28();
- [DllImport("libRfid28.dll", EntryPoint = "openPort")] static extern unsafe int openPort28(int comPort);
- [DllImport("libRfid28.dll", EntryPoint = "closePort")] static extern unsafe int closePort28();
- [DllImport("libRfid28.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort28(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid28.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort28(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid29.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion29();
- [DllImport("libRfid29.dll", EntryPoint = "openPort")] static extern unsafe int openPort29(int comPort);
- [DllImport("libRfid29.dll", EntryPoint = "closePort")] static extern unsafe int closePort29();
- [DllImport("libRfid29.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort29(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid29.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort29(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid30.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion30();
- [DllImport("libRfid30.dll", EntryPoint = "openPort")] static extern unsafe int openPort30(int comPort);
- [DllImport("libRfid30.dll", EntryPoint = "closePort")] static extern unsafe int closePort30();
- [DllImport("libRfid30.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort30(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid30.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort30(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid31.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion31();
- [DllImport("libRfid31.dll", EntryPoint = "openPort")] static extern unsafe int openPort31(int comPort);
- [DllImport("libRfid31.dll", EntryPoint = "closePort")] static extern unsafe int closePort31();
- [DllImport("libRfid31.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort31(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid31.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort31(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid32.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion32();
- [DllImport("libRfid32.dll", EntryPoint = "openPort")] static extern unsafe int openPort32(int comPort);
- [DllImport("libRfid32.dll", EntryPoint = "closePort")] static extern unsafe int closePort32();
- [DllImport("libRfid32.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort32(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid32.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort32(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid33.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion33();
- [DllImport("libRfid33.dll", EntryPoint = "openPort")] static extern unsafe int openPort33(int comPort);
- [DllImport("libRfid33.dll", EntryPoint = "closePort")] static extern unsafe int closePort33();
- [DllImport("libRfid33.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort33(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid33.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort33(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid34.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion34();
- [DllImport("libRfid34.dll", EntryPoint = "openPort")] static extern unsafe int openPort34(int comPort);
- [DllImport("libRfid34.dll", EntryPoint = "closePort")] static extern unsafe int closePort34();
- [DllImport("libRfid34.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort34(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid34.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort34(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid35.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion35();
- [DllImport("libRfid35.dll", EntryPoint = "openPort")] static extern unsafe int openPort35(int comPort);
- [DllImport("libRfid35.dll", EntryPoint = "closePort")] static extern unsafe int closePort35();
- [DllImport("libRfid35.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort35(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid35.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort35(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid36.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion36();
- [DllImport("libRfid36.dll", EntryPoint = "openPort")] static extern unsafe int openPort36(int comPort);
- [DllImport("libRfid36.dll", EntryPoint = "closePort")] static extern unsafe int closePort36();
- [DllImport("libRfid36.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort36(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid36.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort36(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid37.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion37();
- [DllImport("libRfid37.dll", EntryPoint = "openPort")] static extern unsafe int openPort37(int comPort);
- [DllImport("libRfid37.dll", EntryPoint = "closePort")] static extern unsafe int closePort37();
- [DllImport("libRfid37.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort37(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid37.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort37(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid38.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion38();
- [DllImport("libRfid38.dll", EntryPoint = "openPort")] static extern unsafe int openPort38(int comPort);
- [DllImport("libRfid38.dll", EntryPoint = "closePort")] static extern unsafe int closePort38();
- [DllImport("libRfid38.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort38(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid38.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort38(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid39.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion39();
- [DllImport("libRfid39.dll", EntryPoint = "openPort")] static extern unsafe int openPort39(int comPort);
- [DllImport("libRfid39.dll", EntryPoint = "closePort")] static extern unsafe int closePort39();
- [DllImport("libRfid39.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort39(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid39.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort39(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
- [DllImport("libRfid40.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion40();
- [DllImport("libRfid40.dll", EntryPoint = "openPort")] static extern unsafe int openPort40(int comPort);
- [DllImport("libRfid40.dll", EntryPoint = "closePort")] static extern unsafe int closePort40();
- [DllImport("libRfid40.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort40(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
- [DllImport("libRfid40.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort40(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
-
-
- ///
- /// Wrapper function with safe interface and unsafe body
- ///
- /// Water meter (iPerlHead) object
- /// Value returned by openPort(...)
- public static unsafe int OpenPort(IperlHead iperlHead)
- {
- if (iperlHead.DebugLevel != DebugMode.Normal) return 0; /// No function in debug mode
-
- switch (iperlHead.Position)
- {
- default:
- case 1: return openPort1(iperlHead.RfidComPortNr);
- case 2: return openPort2(iperlHead.RfidComPortNr);
- case 3: return openPort3(iperlHead.RfidComPortNr);
- case 4: return openPort4(iperlHead.RfidComPortNr);
- case 5: return openPort5(iperlHead.RfidComPortNr);
- case 6: return openPort6(iperlHead.RfidComPortNr);
- case 7: return openPort7(iperlHead.RfidComPortNr);
- case 8: return openPort8(iperlHead.RfidComPortNr);
- case 9: return openPort9(iperlHead.RfidComPortNr);
- case 10: return openPort10(iperlHead.RfidComPortNr);
- case 11: return openPort11(iperlHead.RfidComPortNr);
- case 12: return openPort12(iperlHead.RfidComPortNr);
- case 13: return openPort13(iperlHead.RfidComPortNr);
- case 14: return openPort14(iperlHead.RfidComPortNr);
- case 15: return openPort15(iperlHead.RfidComPortNr);
- case 16: return openPort16(iperlHead.RfidComPortNr);
- case 17: return openPort17(iperlHead.RfidComPortNr);
- case 18: return openPort18(iperlHead.RfidComPortNr);
- case 19: return openPort19(iperlHead.RfidComPortNr);
- case 20: return openPort20(iperlHead.RfidComPortNr);
- case 21: return openPort21(iperlHead.RfidComPortNr);
- case 22: return openPort22(iperlHead.RfidComPortNr);
- case 23: return openPort23(iperlHead.RfidComPortNr);
- case 24: return openPort24(iperlHead.RfidComPortNr);
- case 25: return openPort25(iperlHead.RfidComPortNr);
- case 26: return openPort26(iperlHead.RfidComPortNr);
- case 27: return openPort27(iperlHead.RfidComPortNr);
- case 28: return openPort28(iperlHead.RfidComPortNr);
- case 29: return openPort29(iperlHead.RfidComPortNr);
- case 30: return openPort30(iperlHead.RfidComPortNr);
- case 31: return openPort31(iperlHead.RfidComPortNr);
- case 32: return openPort32(iperlHead.RfidComPortNr);
- case 33: return openPort33(iperlHead.RfidComPortNr);
- case 34: return openPort34(iperlHead.RfidComPortNr);
- case 35: return openPort35(iperlHead.RfidComPortNr);
- case 36: return openPort36(iperlHead.RfidComPortNr);
- case 37: return openPort37(iperlHead.RfidComPortNr);
- case 38: return openPort38(iperlHead.RfidComPortNr);
- case 39: return openPort39(iperlHead.RfidComPortNr);
- case 40: return openPort40(iperlHead.RfidComPortNr);
- }
- }
-
- ///
- /// Wrapper function with safe interface and unsafe body
- ///
- /// Water meter (iPerlHead) object
- /// Value returned by openPort(...)
- public static unsafe int ClosePort(IperlHead iperlHead)
- {
- if (iperlHead.DebugLevel != DebugMode.Normal) return 0; /// No function in debug mode
-
- switch (iperlHead.Position)
- {
- default:
- case 1: return closePort1();
- case 2: return closePort2();
- case 3: return closePort3();
- case 4: return closePort4();
- case 5: return closePort5();
- case 6: return closePort6();
- case 7: return closePort7();
- case 8: return closePort8();
- case 9: return closePort9();
- case 10: return closePort10();
- case 11: return closePort11();
- case 12: return closePort12();
- case 13: return closePort13();
- case 14: return closePort14();
- case 15: return closePort15();
- case 16: return closePort16();
- case 17: return closePort17();
- case 18: return closePort18();
- case 19: return closePort19();
- case 20: return closePort20();
- case 21: return closePort21();
- case 22: return closePort22();
- case 23: return closePort23();
- case 24: return closePort24();
- case 25: return closePort25();
- case 26: return closePort26();
- case 27: return closePort27();
- case 28: return closePort28();
- case 29: return closePort29();
- case 30: return closePort30();
- case 31: return closePort31();
- case 32: return closePort32();
- case 33: return closePort33();
- case 34: return closePort34();
- case 35: return closePort35();
- case 36: return closePort36();
- case 37: return closePort37();
- case 38: return closePort38();
- case 39: return closePort39();
- case 40: return closePort40();
- }
- }
-
+ #region Simulation / RFID / NFC Interface: ReadRequestPort, WriteRequestPort
///
/// Wrapper function with safe interface and unsafe body
///
/// Water meter (iPerlHead) object
/// Value returned by readRequestPort(...)
- public static unsafe int ReadRequestPort(IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer, int timeout)
- {
+ public static int ReadRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, out byte[] buffer)
+ {
Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries));
+ if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal;
- if (iperlHead.DebugLevel != DebugMode.Normal)
+ if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation
{
- ///
- /// Simulation
- ///
- if ((messageID == MessageID.Configuration) && (offset == 0) && (length == ConfigStruct.Length))
- {
- buffer = new byte[ConfigStruct.Length] { 3, 3, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0, 1,2,3,4,5, 160, 0,0,0,0, 0,0, 0,0, 0,0 };
- }
- else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStruct.Length))
- {
- buffer = new byte[CalibrationStruct.Length] { 3, 0, 150,10, 0, 0, 0,0, 0,0,0,0,0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0,0,0, 1,2,3,4,5, 0, 0 };
- }
- else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStructV4.Length))
- {
- buffer = new byte[CalibrationStructV4.Length] { 3, 0, 150,10, 0, 0, 0,0, 0,0,0,0,0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0,0,0, 1,2,3,4,5, 0, 0, 150,10 };
- }
- else if ((messageID == MessageID.Calibration) && (offset == 2) && (length == 2))
- {
- buffer = new byte[2] { 150,10 };
- }
- else if ((messageID == MessageID.Calibration) && (offset == 34) && (length == 2))
- {
- buffer = new byte[2] { 150,10 };
- }
- else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2))
- {
- buffer = new byte[2] { 0, 0 };
- }
- else
- {
- buffer = new byte[length];
- }
-
- return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13
+ return SimulationServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer);
}
- buffer = new byte[length];
- byte[] buf = new byte[200];
- ///
- fixed (byte* pBuf = buf)
- {
- int retv;
-
- switch (iperlHead.Position)
- {
- default:
- case 1: retv = readRequestPort1(messageID, offset, length, pBuf, timeout); break;
- case 2: retv = readRequestPort2(messageID, offset, length, pBuf, timeout); break;
- case 3: retv = readRequestPort3(messageID, offset, length, pBuf, timeout); break;
- case 4: retv = readRequestPort4(messageID, offset, length, pBuf, timeout); break;
- case 5: retv = readRequestPort5(messageID, offset, length, pBuf, timeout); break;
- case 6: retv = readRequestPort6(messageID, offset, length, pBuf, timeout); break;
- case 7: retv = readRequestPort7(messageID, offset, length, pBuf, timeout); break;
- case 8: retv = readRequestPort8(messageID, offset, length, pBuf, timeout); break;
- case 9: retv = readRequestPort9(messageID, offset, length, pBuf, timeout); break;
- case 10: retv = readRequestPort10(messageID, offset, length, pBuf, timeout); break;
- case 11: retv = readRequestPort11(messageID, offset, length, pBuf, timeout); break;
- case 12: retv = readRequestPort12(messageID, offset, length, pBuf, timeout); break;
- case 13: retv = readRequestPort13(messageID, offset, length, pBuf, timeout); break;
- case 14: retv = readRequestPort14(messageID, offset, length, pBuf, timeout); break;
- case 15: retv = readRequestPort15(messageID, offset, length, pBuf, timeout); break;
- case 16: retv = readRequestPort16(messageID, offset, length, pBuf, timeout); break;
- case 17: retv = readRequestPort17(messageID, offset, length, pBuf, timeout); break;
- case 18: retv = readRequestPort18(messageID, offset, length, pBuf, timeout); break;
- case 19: retv = readRequestPort19(messageID, offset, length, pBuf, timeout); break;
- case 20: retv = readRequestPort20(messageID, offset, length, pBuf, timeout); break;
- case 21: retv = readRequestPort21(messageID, offset, length, pBuf, timeout); break;
- case 22: retv = readRequestPort22(messageID, offset, length, pBuf, timeout); break;
- case 23: retv = readRequestPort23(messageID, offset, length, pBuf, timeout); break;
- case 24: retv = readRequestPort24(messageID, offset, length, pBuf, timeout); break;
- case 25: retv = readRequestPort25(messageID, offset, length, pBuf, timeout); break;
- case 26: retv = readRequestPort26(messageID, offset, length, pBuf, timeout); break;
- case 27: retv = readRequestPort27(messageID, offset, length, pBuf, timeout); break;
- case 28: retv = readRequestPort28(messageID, offset, length, pBuf, timeout); break;
- case 29: retv = readRequestPort29(messageID, offset, length, pBuf, timeout); break;
- case 30: retv = readRequestPort30(messageID, offset, length, pBuf, timeout); break;
- case 31: retv = readRequestPort31(messageID, offset, length, pBuf, timeout); break;
- case 32: retv = readRequestPort32(messageID, offset, length, pBuf, timeout); break;
- case 33: retv = readRequestPort33(messageID, offset, length, pBuf, timeout); break;
- case 34: retv = readRequestPort34(messageID, offset, length, pBuf, timeout); break;
- case 35: retv = readRequestPort35(messageID, offset, length, pBuf, timeout); break;
- case 36: retv = readRequestPort36(messageID, offset, length, pBuf, timeout); break;
- case 37: retv = readRequestPort37(messageID, offset, length, pBuf, timeout); break;
- case 38: retv = readRequestPort38(messageID, offset, length, pBuf, timeout); break;
- case 39: retv = readRequestPort39(messageID, offset, length, pBuf, timeout); break;
- case 40: retv = readRequestPort40(messageID, offset, length, pBuf, timeout); break;
- }
-
- for (int i = 0; i < length; i++) buffer[i] = buf[i];
-
- ///
- /// Logging
- ///
- string name = string.Format("{0}({1})", iperlHead.Name, iperlHead.SerialNr);
- if ((messageID == MessageID.Configuration) && (offset == 0) && (length == ConfigStruct.Length))
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : ConfigStruct.FromByteArray(buffer).ToString());
- else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStruct.Length))
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : CalibrationStruct.FromByteArray(buffer).ToString());
- else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStructV4.Length))
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : CalibrationStructV4.FromByteArray(buffer).ToString());
- else if ((messageID == MessageID.Calibration) && (offset == 2) && (length == 2))
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},2,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("Cal={0}", buf[0] + 256 * buf[1]));
- else if ((messageID == MessageID.Calibration) && (offset == 34) && (length == 2))
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},34,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("CalLNA={0}", buf[0] + 256 * buf[1]));
- else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2))
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},6264,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("LR={0} RL={1}", (int)buf[0], (int)buf[1]));
- else
- rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1}, {2}, {3}, ...) returned {4} {5}", name, messageID, offset, length, retv, (retv != 0) ? "!" : "");
-
- return retv;
+ if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface
+ {
+ return NfcServices.ReadRequest(cfg, iperlHead, structName, offset, length, out buffer);
}
- }
+ else // RFID Interface
+ {
+ return RfidServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer);
+ }
+ }
- ///
- /// Wrapper function with safe interface and unsafe body
- ///
+ ///
+ /// Wrapper function with safe interface and unsafe body
+ ///
/// Water meter (iPerlHead) object
- /// Value returned by writeRequestPort(...)
- public static unsafe int WriteRequestPort(IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer, int timeout)
- {
+ /// Value returned by writeRequestPort(...)
+ public static int WriteRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, byte[] buffer)
+ {
Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries));
+ if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal;
- if (iperlHead.DebugLevel != DebugMode.Normal) return 0;
-
- fixed (byte* pBuf = buffer)
- {
- int retv;
-
- switch (iperlHead.Position)
- {
- default:
- case 1: retv = writeRequestPort1(messageID, offset, length, pBuf, timeout); break;
- case 2: retv = writeRequestPort2(messageID, offset, length, pBuf, timeout); break;
- case 3: retv = writeRequestPort3(messageID, offset, length, pBuf, timeout); break;
- case 4: retv = writeRequestPort4(messageID, offset, length, pBuf, timeout); break;
- case 5: retv = writeRequestPort5(messageID, offset, length, pBuf, timeout); break;
- case 6: retv = writeRequestPort6(messageID, offset, length, pBuf, timeout); break;
- case 7: retv = writeRequestPort7(messageID, offset, length, pBuf, timeout); break;
- case 8: retv = writeRequestPort8(messageID, offset, length, pBuf, timeout); break;
- case 9: retv = writeRequestPort9(messageID, offset, length, pBuf, timeout); break;
- case 10: retv = writeRequestPort10(messageID, offset, length, pBuf, timeout); break;
- case 11: retv = writeRequestPort11(messageID, offset, length, pBuf, timeout); break;
- case 12: retv = writeRequestPort12(messageID, offset, length, pBuf, timeout); break;
- case 13: retv = writeRequestPort13(messageID, offset, length, pBuf, timeout); break;
- case 14: retv = writeRequestPort14(messageID, offset, length, pBuf, timeout); break;
- case 15: retv = writeRequestPort15(messageID, offset, length, pBuf, timeout); break;
- case 16: retv = writeRequestPort16(messageID, offset, length, pBuf, timeout); break;
- case 17: retv = writeRequestPort17(messageID, offset, length, pBuf, timeout); break;
- case 18: retv = writeRequestPort18(messageID, offset, length, pBuf, timeout); break;
- case 19: retv = writeRequestPort19(messageID, offset, length, pBuf, timeout); break;
- case 20: retv = writeRequestPort20(messageID, offset, length, pBuf, timeout); break;
- case 21: retv = writeRequestPort21(messageID, offset, length, pBuf, timeout); break;
- case 22: retv = writeRequestPort22(messageID, offset, length, pBuf, timeout); break;
- case 23: retv = writeRequestPort23(messageID, offset, length, pBuf, timeout); break;
- case 24: retv = writeRequestPort24(messageID, offset, length, pBuf, timeout); break;
- case 25: retv = writeRequestPort25(messageID, offset, length, pBuf, timeout); break;
- case 26: retv = writeRequestPort26(messageID, offset, length, pBuf, timeout); break;
- case 27: retv = writeRequestPort27(messageID, offset, length, pBuf, timeout); break;
- case 28: retv = writeRequestPort28(messageID, offset, length, pBuf, timeout); break;
- case 29: retv = writeRequestPort29(messageID, offset, length, pBuf, timeout); break;
- case 30: retv = writeRequestPort30(messageID, offset, length, pBuf, timeout); break;
- case 31: retv = writeRequestPort31(messageID, offset, length, pBuf, timeout); break;
- case 32: retv = writeRequestPort32(messageID, offset, length, pBuf, timeout); break;
- case 33: retv = writeRequestPort33(messageID, offset, length, pBuf, timeout); break;
- case 34: retv = writeRequestPort34(messageID, offset, length, pBuf, timeout); break;
- case 35: retv = writeRequestPort35(messageID, offset, length, pBuf, timeout); break;
- case 36: retv = writeRequestPort36(messageID, offset, length, pBuf, timeout); break;
- case 37: retv = writeRequestPort37(messageID, offset, length, pBuf, timeout); break;
- case 38: retv = writeRequestPort38(messageID, offset, length, pBuf, timeout); break;
- case 39: retv = writeRequestPort39(messageID, offset, length, pBuf, timeout); break;
- case 40: retv = writeRequestPort40(messageID, offset, length, pBuf, timeout); break;
- }
-
- ///
- /// Logging
- ///
- string name = string.Format("{0}({1})", iperlHead.Name, iperlHead.SerialNr);
- if (length == 1)
- rfidDataLogger.InfoFormat("{0}: WriteRequestPort({2}, {3}, {4}, {5}) returned {1} {6}", name, retv, messageID, offset, length, pBuf[0].ToString("X2"), (retv != 0) ? "!" : "");
- else if (length == 2)
- {
- if (messageID == MessageID.Calibration && offset == 2)
- {
- UInt16 calibFactor = (UInt16)(pBuf[0] + 256 * pBuf[1]);
- rfidDataLogger.InfoFormat("{0}: WriteRequestPort(Cal={1}) returned {2} {3}", name, calibFactor, retv, (retv != 0) ? "!" : "");
- }
- else if (messageID == MessageID.Calibration && offset == 34)
- {
- UInt16 calibFactor = (UInt16)(pBuf[0] + 256 * pBuf[1]);
- rfidDataLogger.InfoFormat("{0}: WriteRequestPort(CalLNA={1}) returned {2} {3}", name, calibFactor, retv, (retv != 0) ? "!" : "");
- }
- else
- rfidDataLogger.InfoFormat("{0}: WriteRequestPort({2}, {3}, {4}, {5} {6}) returned {1} {7}", name, retv, messageID, offset, length, pBuf[0].ToString("X2"), pBuf[1].ToString("X2"), (retv != 0) ? "!" : "");
- }
- else
- rfidDataLogger.InfoFormat("{0}: WriteRequestPort({2}, {3}, {4}, {5} {6} ...) returned {1} {7}", name, retv, messageID, offset, length, pBuf[0].ToString("X2"), pBuf[1].ToString("X2"), (retv != 0) ? "!" : "");
-
- return retv;
+ if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation
+ {
+ return SimulationServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer);
}
- }
-#endregion DLL_Interface
+ if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface
+ {
+ return NfcServices.WriteRequest(cfg, iperlHead, structName, offset, length, buffer);
+ }
+ else // RFID Interface
+ {
+ return RfidServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer);
+ }
+ }
+ #endregion iPerl_Head_RFID_Interface: ReadRequestPort, WriteRequestPort
- readonly bool checkBoxesEditMode;
+ readonly bool checkBoxesEditMode;
DateTime startTime;
int startTimeSec;
@@ -698,7 +191,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
///
/// RFID multiplexer PCB / RFID serial port and worker thread related variables
///
- static TestMethodCfg cfg;
+ static TestMethod testMethod;
+ public static TestMethodCfg cfg;
static IList tests;
static IList multiTestParams;
@@ -726,21 +220,40 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public iPerlCommunicationForm(bool isCheckBoxesEditMode)
: this()
{
+ iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default iPerl Head communication params
if (isCheckBoxesEditMode)
{
checkBoxesEditMode = true;
saveButton.Visible = true;
activityLabel.Text = Strings.Optical_heads;
ShuffleTextBoxes(ProcessData.WMsCount, ProcessData.LineSize);
+
+#if IPERL
+ ContextMenu cm = new ContextMenu();
+ cm.MenuItems.Add(NewMenuItem("Read PCB Number" , "ReadPCB"));
+ cm.MenuItems.Add(NewMenuItem("Enter Test Mode" , "StartTestMode"));
+ cm.MenuItems.Add(NewMenuItem("Turn Off Test Mode (Enter Active Mode)", "TurnOffTestMode"));
+ cm.MenuItems.Add(NewMenuItem("Set Production Mode (Radio not start with flow)" , "SetProductionMode"));
+ cm.MenuItems.Add(NewMenuItem("Turn Off Radio" , "TurnOffRadio"));
+ cm.MenuItems.Add(NewMenuItem($"Set RFID mode ({Strings.Program_restart_is_required_to_apply_some_settings})" , "SetRFID"));
+ cm.MenuItems.Add(NewMenuItem($"Set NFC mode ({Strings.Program_restart_is_required_to_apply_some_settings})" , "SetNFC"));
+ /*if (Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser)
+ {
+ //cm.MenuItems.Add(NewMenuItem("Test WriteRequestPort (u8_Customer_Text)", "WriteRequestPort_u8_Customer_Text"));
+ cm.MenuItems.Add(NewMenuItem("Open sealing", "OpenSealing"));
+ }*/
+ this.ContextMenu = cm;
+#endif
}
}
+
- ///
+ ///
/// Constructor for one iPerlCommunication 'test'
///
/// Number of text boxes for serial numbers
- public iPerlCommunicationForm(TestMethodCfg cfg, Test test, iPerlCommunicationParams testParams)
- : this(cfg, new List { test }, new List { testParams })
+ public iPerlCommunicationForm(TestMethod testMethod, Test test, iPerlCommunicationParams testParams)
+ : this(testMethod, new List { test }, new List { testParams })
{
}
@@ -748,12 +261,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Constructor for multiple iPerlCommunication 'tests'
///
/// Number of text boxes for serial numbers
- public iPerlCommunicationForm(TestMethodCfg cfg, IList tests, IList multiTestParams)
+ public iPerlCommunicationForm(TestMethod testMethod, IList tests, IList multiTestParams)
: this()
{
checkBoxesEditMode = false;
- iPerlCommunicationForm.cfg = cfg;
+ iPerlCommunicationForm.testMethod = testMethod;
+ iPerlCommunicationForm.cfg = testMethod.Cfg as TestMethodCfg;
iPerlCommunicationForm.tests = tests;
iPerlCommunicationForm.multiTestParams = multiTestParams;
@@ -939,7 +453,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
ResizeDlgToFitEnabledControls();
}
-
void ResizeDlgToFitEnabledControls()
{
int xMax = 0;
@@ -1067,7 +580,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
- #region Forced close handling
+ #region Forced close handling
public void StartForceCloseHandler()
{
@@ -1090,7 +603,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
Close();
}
- #endregion
+ #endregion
///
@@ -1122,7 +635,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
int count = 0;
for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++)
{
- Results.Entities.WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0)
+ WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0)
? ProcessData.BatchRslts.Batch.WaterMeters[wmNr0] : null;
IperlHead ihead = iperlHeads[wmNr0];
@@ -1170,7 +683,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
{
wmFound = true;
- Results.Entities.WaterMeter wm = null;
+ WaterMeter wm = null;
if (ProcessData.BatchRslts.Batch.WaterMeters != null)
{
foreach (var w in ProcessData.BatchRslts.Batch.WaterMeters)
@@ -1214,8 +727,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL, currentActivity.Substring(WriteQ2CorrectionRLStr.Length).Trim());
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR, currentActivity.Substring(WriteQ2CorrectionLRStr.Length).Trim());
else if (currentActivity.ToLower() == WriteQ2CorrectionIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_incl_05, null);
+ else if (currentActivity.ToLower() == WriteQ2CorrectionPlusIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_plus_incl_05, null);
else if (currentActivity.ToLower() == WriteQ2CorrectionAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_incl_05, null);
- else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceIncl05Str.ToLower()))error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(WriteQ2CorrectionGreeceIncl05Str.Length).Trim());
+ else if (currentActivity.ToLower() == WriteQ2CorrectionPlusAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_plus_incl_05, null);
+ else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(WriteQ2CorrectionGreeceIncl05Str.Length).Trim());
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL_incl_05, currentActivity.Substring(WriteQ2CorrectionRLIncl05Str.Length).Trim());
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR_incl_05, currentActivity.Substring(WriteQ2CorrectionLRIncl05Str.Length).Trim());
else if (currentActivity.ToLower().Contains(UpdateBothQ2FactorsTestRLOnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestRLDir, null);
@@ -1229,12 +744,29 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
else if (currentActivity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower()) error = GetQ2PreCorrectionsFormRest(threadID, ihead, wm, ref resultStr);
else if (currentActivity.ToLower() == DewaReworkRLStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.R_L, ref resultStr);
else if (currentActivity.ToLower() == DewaReworkLRStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.L_R, ref resultStr);
-
+ else if (currentActivity.ToLower().Contains(StartTestingSealedMetersStr.ToLower())) error = StartTestingSealedMeter(ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower().Contains(EndTestingSealedMetersStr.ToLower())) error = EndTestingSealedMeter(ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower().Contains(SimulateCmd.ToLower())) error = Simulate(ihead, wm, ref resultStr);
#endif
else
{
error = CommErr.None;
- resultStr = "Invalid activity";
+
+ ConditionID id = ConditionID.Count;
+#if IPERL
+ for (id = ConditionID.A; id < ConditionID.Count; id++)
+ {
+ if (currentActivity.ToLower() == string.Format(SequenceConditionOp.ConditionNameFmt, id).ToLower())
+ {
+ error = SetIperlCommMilestoneReached(testMethod, id, ref resultStr);
+ break;
+ }
+ }
+#endif
+ if (id == ConditionID.Count)
+ {
+ resultStr = "Invalid activity"; /// No activity or milestone
+ }
}
///
@@ -1313,7 +845,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr ReadConfiguration(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr ReadConfiguration(IperlHead ihead, WaterMeter wm, ref string resultStr)
{
///
/// The activity is "Read configuration" (this enables the watermeter, resets error flag)
@@ -1328,30 +860,19 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
ihead.ConfigStruct = null; /// Clear previous ConfigStruct, avoid reuse of (not anymore valid) PCB Number
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Read;
int readRetVal = 0;
/// Read configuration
byte[] config = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ readRetVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config);
+ if (readRetVal == 0)
{
- readRetVal = ReadRequestPort(ihead, MessageID.Configuration, 0, ConfigStruct.Length, out config, cfg.CommTimeout);
- if (readRetVal == 0)
- {
- error = CommErr.None;
- ihead.ConfigStruct = ConfigStruct.FromByteArray(config);
- resultStr = ihead.ConfigStruct.ToString(1);
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
+ ihead.ConfigStruct = ConfigStruct.FromByteArray(config);
+ resultStr = ihead.ConfigStruct.ToString(1);
}
- ClosePort(ihead); /// Close RFID port
-
return error + Math.Max(0, Math.Min(readRetVal, 4));
}
@@ -1390,8 +911,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
/// Communication necessary
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.None;
if (error==CommErr.None && (ihead.ConfigStruct.TestModeConfig != testModeConfig) && (ihead.ConfigStruct.MeterState != MeterState.Active))
@@ -1399,16 +918,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Switch to Active mode in order to change TestModeConfig
error = CommErr.CmdActive;
byte[] cmd = new byte[1] { (byte)Command.SetActiveMode };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd))
{
- if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd, cfg.CommTimeout))
- {
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
}
/// Delay min. 250 ms
@@ -1420,17 +932,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Change the TestModeConfig if necessary
error = CommErr.Write;
byte[] tstMdCfg = new byte[1] { testModeConfig };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 21, 1, tstMdCfg))
{
- if (0 == WriteRequestPort(ihead, MessageID.Configuration, 21, 1, tstMdCfg, cfg.CommTimeout))
- {
- ihead.ConfigStruct.Update(21, tstMdCfg);
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ ihead.ConfigStruct.Update(21, tstMdCfg);
+ error = CommErr.None;
}
/// Delay min. 250 ms
@@ -1442,16 +947,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Switch to test mode
error = CommErr.CmdTest;
byte[] cmd = new byte[1] { (byte)Command.SetTestMode };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd))
{
- if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd, cfg.CommTimeout))
- {
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
}
/// Delay min. 250 ms
@@ -1462,28 +960,21 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
if (error == CommErr.None)
{
/// Verify the configuration
+ Thread.Sleep(2000); // RFID: 1000 ms is enough, NFC needs min 2000 ms
error = CommErr.Verify;
byte[] config = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ int retVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config);
+ if (0 == retVal)
{
- if (0 == ReadRequestPort(ihead, MessageID.Configuration, 0, ConfigStruct.Length, out config, cfg.CommTimeout))
+ ihead.ConfigStruct = ConfigStruct.FromByteArray(config);
+ if ((ihead.ConfigStruct.MeterState == MeterState.Test) && (ihead.ConfigStruct.TestModeConfig == testModeConfig))
{
- ihead.ConfigStruct = ConfigStruct.FromByteArray(config);
- if ((ihead.ConfigStruct.MeterState == MeterState.Test) && (ihead.ConfigStruct.TestModeConfig == testModeConfig))
- {
- error = CommErr.None;
- resultStr = ihead.ConfigStruct.ToString(1);
- break;
- }
+ error = CommErr.None;
+ resultStr = ihead.ConfigStruct.ToString(1);
}
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
}
}
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -1497,22 +988,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// true on success
static CommErr SetActiveMode(int threadId, IperlHead ihead, ref string resultStr)
{
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.CmdActive;
/// Switch to active mode
byte[] cmd = new byte[1] { (byte)Command.SetActiveMode };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd))
{
- if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd, cfg.CommTimeout))
- {
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
}
#if VERIFY_ACTIVE_MODE
@@ -1522,25 +1004,18 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read configuration
byte[] cfg_0_3 = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
if (ihead.ConfigStruct == null)
{
- if (0 == ReadRequestPort(threadId, ihead, MessageID.Configuration, 0, 4, out cfg_0_3, cfg.CommTimeout))
+ if (0 == ReadRequestPort(threadId, ihead, MessageID.Configuration, 0, 4, out cfg_0_3))
{
ihead.ConfigStruct.Update(0, cfg_0_3);
if (ihead.ConfigStruct.MeterState == MeterState.Active)
{
error = CommErr.None;
resultStr = ihead.ConfigStruct.ToString(1);
- break;
}
}
}
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
- }
}
#else
if (error == CommErr.None)
@@ -1552,8 +1027,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
#endif
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -1564,41 +1037,30 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr ReadCalibration(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr ReadCalibration(IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Read;
int readRetVal = 0;
/// Read calibration
byte[] calib = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStruct.Length, out calib);
+ if (readRetVal == 0)
{
- readRetVal = ReadRequestPort(ihead, MessageID.Calibration, 0, CalibrationStruct.Length, out calib, cfg.CommTimeout);
- if (readRetVal == 0)
- {
- ihead.CalibrationStruct = CalibrationStruct.FromByteArray(calib);
+ ihead.CalibrationStruct = CalibrationStruct.FromByteArray(calib);
- if (wm.OrigCalibFactor == 0)
- {
- wm.OrigCalibFactor = ihead.CalibrationStruct.Calibration;
- wm.FWVersion = ihead.CalibrationStruct.FWVersionStr();
- }
+ if (wm.OrigCalibFactor == 0)
+ {
+ wm.OrigCalibFactor = ihead.CalibrationStruct.Calibration;
+ wm.FWVersion = ihead.CalibrationStruct.FWVersionStr();
+ }
- resultStr = ihead.CalibrationStruct.ToString();
- error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ resultStr = ihead.CalibrationStruct.ToString();
+ error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType;
}
- ClosePort(ihead); /// Close RFID port
-
return error + Math.Max(0, Math.Min(readRetVal, 4));
}
@@ -1609,42 +1071,31 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr ReadCalibrationV4(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr ReadCalibrationV4(IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Read;
int readRetVal = 0;
/// Read calibration
byte[] calib = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStructV4.Length, out calib);
+ if (readRetVal == 0)
{
- readRetVal = ReadRequestPort(ihead, MessageID.Calibration, 0, CalibrationStructV4.Length, out calib, cfg.CommTimeout);
- if (readRetVal == 0)
+ ihead.CalibrationStructV4 = CalibrationStructV4.FromByteArray(calib);
+
+ if ((wm.OrigCalibFactor == 0) && (wm.OrigCalibFactorLNA == 0))
{
- ihead.CalibrationStructV4 = CalibrationStructV4.FromByteArray(calib);
-
- if ((wm.OrigCalibFactor == 0) && (wm.OrigCalibFactorLNA == 0))
- {
- wm.OrigCalibFactor = ihead.CalibrationStructV4.Calibration;
- wm.OrigCalibFactorLNA = ihead.CalibrationStructV4.CalibrationLNA;
- wm.FWVersion = ihead.CalibrationStructV4.FWVersionStr();
- }
-
- resultStr = ihead.CalibrationStructV4.ToString();
- error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType;
- break;
+ wm.OrigCalibFactor = ihead.CalibrationStructV4.Calibration;
+ wm.OrigCalibFactorLNA = ihead.CalibrationStructV4.CalibrationLNA;
+ wm.FWVersion = ihead.CalibrationStructV4.FWVersionStr();
}
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ resultStr = ihead.CalibrationStructV4.ToString();
+ error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType;
}
- ClosePort(ihead); /// Close RFID port
-
return error + Math.Max(0, Math.Min(readRetVal, 4));
}
@@ -1658,7 +1109,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr WriteCalibrationFactor(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr WriteCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed;
@@ -1752,43 +1203,33 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
///
/// Start communication with iPerl
///
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error;
byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) };
- int writeAndVerifyRetries = 0;
- do
+ ///
+ /// Write the new calibration factor (up to cfg.MaxCommRetries tims)
+ ///
+ error = CommErr.Write;
+ if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data))
{
///
- /// Write the new calibration factor (up to cfg.MaxCommRetries tims)
- ///
- error = CommErr.Write;
- if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout))
- {
- ///
- /// Read and verify the calibration factor
- ///
- error = CommErr.ReadAfterWrite;
- byte[] calib_2_3 = null;
- if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout))
- {
- error = CommErr.Verify;
- if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1])
- {
- error = CommErr.None;
- ihead.CalibrationStruct.Update(data, 2);
- wm.CalibFactor = newCalibFactor;
- resultStr = ihead.CalibrationStruct.ToString();
- break;
- }
- }
+ /// Read and verify the calibration factor
+ ///
+ error = CommErr.ReadAfterWrite;
+ byte[] calib_2_3 = null;
+ if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3))
+ {
+ error = CommErr.Verify;
+ if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1])
+ {
+ error = CommErr.None;
+ ihead.CalibrationStruct.Update(data, 2);
+ wm.CalibFactor = newCalibFactor;
+ resultStr = ihead.CalibrationStruct.ToString();
+ }
}
-
- ihead.CalibrationStruct.Update(data, 2);
}
- while (++writeAndVerifyRetries <= cfg.MaxCommRetries);
- ClosePort(ihead); /// Close RFID port
+ ihead.CalibrationStruct.Update(data, 2);
return error;
}
@@ -1803,7 +1244,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr WriteCalibrationV4Factors(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr WriteCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed;
@@ -1918,59 +1359,41 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
///
/// Start communication with iPerl
///
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error;
byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) };
byte[] dataLNA = new byte[2] { (byte)(newCalibFactorLNA & 0x00FF), (byte)((newCalibFactorLNA >> 8) & 0x00FF) };
- int writeAndVerifyRetries = 0;
- do
+ ///
+ /// Write the new calibration factor (up to cfg.MaxCommRetries tims)
+ ///
+ error = CommErr.Write;
+ if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data) &&
+ 0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, dataLNA))
{
///
- /// Write the new calibration factor (up to cfg.MaxCommRetries tims)
- ///
- error = CommErr.Write;
- if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout) &&
- 0 == WriteRequestPort(ihead, MessageID.Calibration, 34, 2, dataLNA, cfg.CommTimeout))
+ /// Read and verify the calibration factor
+ ///
+ error = CommErr.ReadAfterWrite;
+ byte[] calib_2_3 = null;
+ byte[] calib_34_35 = null;
+ if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3) &&
+ 0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, out calib_34_35))
{
- ///
- /// Read and verify the calibration factor
- ///
- error = CommErr.ReadAfterWrite;
- byte[] calib_2_3 = null;
- byte[] calib_34_35 = null;
- if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout) &&
- 0 == ReadRequestPort(ihead, MessageID.Calibration, 34, 2, out calib_34_35, cfg.CommTimeout))
+ error = CommErr.Verify;
+ if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1] &&
+ calib_34_35 != null && calib_34_35.Length == 2 && dataLNA[0] == calib_34_35[0] && dataLNA[1] == calib_34_35[1])
{
- error = CommErr.Verify;
- if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1] &&
- calib_34_35 != null && calib_34_35.Length == 2 && dataLNA[0] == calib_34_35[0] && dataLNA[1] == calib_34_35[1])
- {
- error = CommErr.None;
- ihead.CalibrationStructV4.Update(data, 2);
- ihead.CalibrationStructV4.Update(dataLNA, 34);
- wm.CalibFactor = newCalibFactor;
- wm.CalibFactorLNA = newCalibFactorLNA;
- resultStr = ihead.CalibrationStructV4.ToString();
- break;
- }
+ error = CommErr.None;
+ ihead.CalibrationStructV4.Update(data, 2);
+ ihead.CalibrationStructV4.Update(dataLNA, 34);
+ wm.CalibFactor = newCalibFactor;
+ wm.CalibFactorLNA = newCalibFactorLNA;
+ resultStr = ihead.CalibrationStructV4.ToString();
}
}
-
- ihead.CalibrationStructV4.Update(data, 2);
- ihead.CalibrationStructV4.Update(dataLNA, 34);
-
- writeAndVerifyRetries++;
-
- if ((writeAndVerifyRetries <= cfg.MaxCommRetries) && (cfg.DelayBetweenRetries > 0))
- {
- /// Delay between retries
- Thread.Sleep(cfg.DelayBetweenRetries);
- }
}
- while (writeAndVerifyRetries <= cfg.MaxCommRetries);
- ClosePort(ihead); /// Close RFID port
+ ihead.CalibrationStructV4.Update(data, 2);
+ ihead.CalibrationStructV4.Update(dataLNA, 34);
return error;
}
@@ -1982,7 +1405,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter
/// TestData (name and repetitions)
/// (1) selected MeterTestRslt or (2) average of repeated MTR-s or (3) null when at least one MTR is missing
- static Results.Entities.MeterTestRslt GetAverageTestRslt(Results.Entities.WaterMeter wm, Results.Entities.TestData testData)
+ static Results.Entities.MeterTestRslt GetAverageTestRslt(WaterMeter wm, Results.Entities.TestData testData)
{
Results.Entities.MeterTestRslt avgTestRslt;
@@ -2014,18 +1437,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr NormalizeCalibrationFactor(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr NormalizeCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed;
if (ihead.FactorLimitLo <= ihead.CalibFactor && ihead.CalibFactor <= ihead.FactorLimitHi)
{
- resultStr = "Calibratin factor is OK";
+ resultStr = "Calibration factor is OK";
return CommErr.None; /// No need to update the calibration factor
}
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Write;
/// Determine the new calibration factor
@@ -2055,17 +1476,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data))
{
- if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout))
- {
- error = CommErr.None;
- ihead.CalibrationStruct.Update(data, 2);
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
+ ihead.CalibrationStruct.Update(data, 2);
}
if (error == CommErr.None)
@@ -2074,23 +1488,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read calibration
byte[] calib_2_3 = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3))
{
- if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout))
- {
- error = CommErr.None;
- ihead.CalibrationStruct.Update(calib_2_3, 2);
- resultStr = ihead.CalibrationStruct.ToString();
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
+ ihead.CalibrationStruct.Update(calib_2_3, 2);
+ resultStr = ihead.CalibrationStruct.ToString();
}
}
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -2101,7 +1506,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr NormalizeCalibrationV4Factors(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr NormalizeCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed;
@@ -2111,8 +1516,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
return CommErr.None; /// No need to update the calibration factor
}
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Write;
/// Determine the new calibration factor
@@ -2142,17 +1545,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data))
{
- if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data, cfg.CommTimeout))
- {
- error = CommErr.None;
- ihead.CalibrationStructV4.Update(data, 2);
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
+ ihead.CalibrationStructV4.Update(data, 2);
}
if (error == CommErr.None)
@@ -2161,23 +1557,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read calibration
byte[] calib_2_3 = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3))
{
- if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3, cfg.CommTimeout))
- {
- error = CommErr.None;
- ihead.CalibrationStructV4.Update(calib_2_3, 2);
- resultStr = ihead.CalibrationStructV4.ToString();
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
+ ihead.CalibrationStructV4.Update(calib_2_3, 2);
+ resultStr = ihead.CalibrationStructV4.ToString();
}
}
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -2189,27 +1576,18 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr ReadQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr ReadQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Read;
/// Write zero Q2 correction
byte[] rdData = null;
///
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, 2, out rdData))
{
- if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout))
- {
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ error = CommErr.None;
}
if ((error == CommErr.None) && (rdData != null) && (rdData.Length == 2))
@@ -2219,8 +1597,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
wm.Q2CorrRL = ihead.Q2CorrRL = (int)((SByte)rdData[1]);
}
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -2231,7 +1607,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr ResetQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr ResetQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, 0, 0);
}
@@ -2243,7 +1619,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
@@ -2299,29 +1675,20 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr WriteQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr, int factorLR, int factorRL)
+ static CommErr WriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr, int factorLR, int factorRL)
{
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Write;
/// Write zero Q2 correction
byte[] wrData = new byte[2] { (byte)factorLR, (byte)factorRL };
///
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
- {
- wm.Q2CorrRL = ihead.Q2CorrRL = factorRL;
- wm.Q2CorrLR = ihead.Q2CorrLR = factorLR;
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData))
+ {
+ wm.Q2CorrRL = ihead.Q2CorrRL = factorRL;
+ wm.Q2CorrLR = ihead.Q2CorrLR = factorLR;
+ error = CommErr.None;
}
///
@@ -2335,19 +1702,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read calibration
byte[] rdData = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout)) &&
+ if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData)) &&
(rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0))
{
error = CommErr.None;
resultStr = string.Format("Q2 correction set to LR={0}, RL={1}", factorLR, factorRL);
- break;
}
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
- }
}
#else
if (error == CommErr.None)
@@ -2356,13 +1716,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
#endif
- ClosePort(ihead); /// Close RFID port
-
return error;
}
- static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
if (wm.Pruefindex == 0) return CommErr.CommFailed; /// Unknown pruefindex
@@ -2426,27 +1784,18 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr Reset2HzCorrection(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr Reset2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Write;
/// Write zero Q2 correction
byte[] wrData = new byte[1] { 0 };
- ///
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
- {
- error = CommErr.None;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ ///
+ if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData))
+ {
+ error = CommErr.None;
}
///
@@ -2460,20 +1809,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read calibration
byte[] rdData = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData, cfg.CommTimeout)) &&
+ if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData)) &&
(rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0))
{
error = CommErr.None;
resultStr = "2Hz correction reset to 0";
ihead.Q2CorrectionFactor = 0;
- break;
}
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
- }
}
#else
if (error == CommErr.None)
@@ -2483,8 +1825,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
#endif
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -2502,13 +1842,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr CalculateAndWriteQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm,
+ static CommErr CalculateAndWriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm,
Test test, ref string resultStr, Q2CorrType q2CorrType, string restOfLine)
{
var args = string.IsNullOrEmpty(restOfLine) ? new string[0] : restOfLine.Split(new char[] { ' ' });
Results.Entities.MeterTestRslt q2adjResult; /// The only test or the 1st test (the test in R-L direction)
- Results.Entities.TestData q2adjTestData;
+ Results.Entities.TestData q2adjTestData; /// The 2nd test in L-R direction in case tests in both directions are done
///
if (args.Length == 0)
{
@@ -2550,10 +1890,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
}
- q2adjResult.Error = Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, q2adjResult.VolumeRef);
+ q2adjResult.Error = Config.Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, q2adjResult.VolumeRef);
}
}
+ var q3mtr = wm.MeterTestRslts.FirstOrDefault(x => x.Name() == "Q3");
+ double q3error = (q3mtr != null) ? q3mtr.Error : 0;
Results.Entities.MeterTestRslt q2adjResult2 = null; /// 2nd test name for a test in L-R direction
Results.Entities.TestData q2adjTestData2 = null;
@@ -2591,7 +1933,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
}
- q2adjResult2.Error = Formulas.ErrorFromVolumes(q2adjResult2.VolumeMeter, q2adjResult2.VolumeRef);
+ q2adjResult2.Error = Config.Formulas.ErrorFromVolumes(q2adjResult2.VolumeMeter, q2adjResult2.VolumeRef);
}
}
@@ -2612,125 +1954,105 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
return CommErr.None; /// No Q2 correction when doing conditional update and WM passed
}
-
- double errLimitLo = test.ErrLimLo + test.Uncertainty;
+ double errLimitLo = test.ErrLimLo + test.Uncertainty;
double errLimitHi = test.ErrLimHi - test.Uncertainty;
- ///
- if (q2adjResult.Error < errLimitLo || errLimitHi < q2adjResult.Error ||
- (q2adjResult2 != null && (q2adjResult2.Error < errLimitLo || errLimitHi < q2adjResult2.Error)))
- {
- /// At least one of Q2 errors is out of range for Q2 correction
- log.WarnFormat("OoR => no Q2 correction: Pos={0}, PCB#={1}, ***Q2_RL err={2}%***, ***Q2_LR err={3}%***, CalTarget={4}%, [Lo={5}%, Hi={6}%]",
- ihead.Name,
- ihead.SerialNr,
- q2adjResult.Error.ToString("F2"),
- q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty,
- ihead.CalibTargetQ2.ToString("F1"),
- errLimitLo.ToString("F2"),
- errLimitHi.ToString("F2"));
-
- resultStr = string.Format("Q2 error is out of range => no Q2 correction");
- rfidDataLogger.InfoFormat("{0}({1}): Q2 error ({2},{3}) is out of range ({4}..{5}) => Failed",
- ihead.Name,
- ihead.SerialNr,
- q2adjResult.Error.ToString("F2"),
- q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty,
- errLimitLo.ToString("F2"),
- errLimitHi.ToString("F2"));
- return CommErr.Q2OutOfRange;
- }
-
///
- /// Calculate Q2 correction factor(s) from an error measured at Q2
+ /// Calculate Q2 correction factor(s)
///
- double q2Correction = 0;
- double q2Correction2 = 0; /// L-R direction in case of Q2CorrType.Update and Q2CorrType.ConditionalUpdate
-
- if (q2CorrType == Q2CorrType.Update || q2CorrType == Q2CorrType.ConditionalUpdate)
- {
- /// Calculate two Q2 correction factors from two tests done in both directions
- q2Correction = ihead.CalculateQ2CorrectionFactor(q2adjResult, ihead.CalibTargetQ2, q2adjTestData.Qfrom, q2adjResult.Q2CorrRL);
- q2Correction2 = ihead.CalculateQ2CorrectionFactor(q2adjResult2, ihead.CalibTargetQ2, q2adjTestData2.Qfrom, q2adjResult2.Q2CorrLR);
- }
- else
- {
- /// Calculate Q2 correction factors from a single test
- q2Correction = ihead.CalculateQ2CorrectionFactor(q2adjResult, ihead.CalibTargetQ2, q2adjTestData.Qfrom, q2adjResult.Q2CorrRL);
- q2Correction2 = ihead.CalculateQ2CorrectionFactor(q2adjResult, ihead.CalibTargetQ2, q2adjTestData.Qfrom, q2adjResult.Q2CorrLR);
- }
-
-
int q2CorrRL = 0;
int q2CorrLR = 0;
///
- if (q2CorrType == Q2CorrType.Standard || q2CorrType == Q2CorrType.Standard_incl_05 || q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestRLDir)
+ if (q2CorrType == Q2CorrType.Standard ||
+ q2CorrType == Q2CorrType.Standard_incl_05 ||
+ q2CorrType == Q2CorrType.Standard_plus_incl_05)
{
///
- /// Standard process
+ /// Standard process (RL)
+ /// No 2nd Q2 test, MakeQ2CorrectedFrom(...) is used to calculate Q2 error
+ /// Do not forget to modify iPerlCommunicationSeq.MakeQ2CorrectedFrom(...)
///
- if (q2CorrType == Q2CorrType.Standard && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5)
- {
- resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
- return CommErr.None;
- }
-
- q2CorrRL = (int)Math.Round(1.1 * q2Correction);
- q2CorrLR = (int)Math.Round(0.5 * q2Correction);
+ double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error);
+ q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom, errorTarget))));
}
- else if (q2CorrType == Q2CorrType.Dewa || q2CorrType == Q2CorrType.Dewa_incl_05)
+ else if (q2CorrType == Q2CorrType.Dewa ||
+ q2CorrType == Q2CorrType.Dewa_incl_05 ||
+ q2CorrType == Q2CorrType.Dewa_plus_incl_05)
{
///
- /// Process for DEWA
+ /// Standard process for the oposite flow direction (LR)
+ /// No 2nd Q2 test, MakeQ2CorrectedFrom(...) is used to calculate Q2 error
+ /// Do not forget to modify iPerlCommunicationSeq.MakeQ2CorrectedFrom(...)
///
- if (q2CorrType == Q2CorrType.Dewa && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5)
+ double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error);
+ q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom, errorTarget))));
+ }
+ else if (q2CorrType == Q2CorrType.RL ||
+ q2CorrType == Q2CorrType.RL_incl_05 ||
+ q2CorrType == Q2CorrType.ConditionalUpdateRL)
+ {
+ ///
+ /// RL only
+ /// Assuming the 2nd Q2 test is done afterwards
+ /// MakeQ2CorrectedFrom(...) is not used
+ ///
+ if (q2CorrType == Q2CorrType.RL && Math.Abs(q2adjResult.Error) <= 0.5)
{
resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
return CommErr.None;
}
- /// Use the same correction factor in both directions
- q2CorrRL = (int)Math.Round(1.0 * q2Correction2);
- q2CorrLR = (int)Math.Round(1.0 * q2Correction2);
+ q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom))));
+ }
+ else if (q2CorrType == Q2CorrType.LR ||
+ q2CorrType == Q2CorrType.LR_incl_05 ||
+ q2CorrType == Q2CorrType.ConditionalUpdateLR)
+ {
+ ///
+ /// LR only
+ /// Assuming the 2nd Q2 test is done afterwards
+ /// MakeQ2CorrectedFrom(...) is not used
+ ///
+ if (q2CorrType == Q2CorrType.LR && Math.Abs(q2adjResult.Error) <= 0.5)
+ {
+ resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
+ return CommErr.None;
+ }
+
+ q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom))));
+ }
+ else if (q2CorrType == Q2CorrType.Update || q2CorrType == Q2CorrType.ConditionalUpdate)
+ {
+ ///
+ /// After tests in both directions
+ /// Assuming the 2nd Q2 tests are done afterwards
+ /// MakeQ2CorrectedFrom(...) is not used
+ ///
+ q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom))));
+ q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult2, q2adjResult2.Q2CorrLR, q2adjTestData2.Qfrom))));
}
else if (q2CorrType == Q2CorrType.Greece || q2CorrType == Q2CorrType.Greece_incl_05 || q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestLRDir)
{
///
/// Process for Greece
///
- if (q2CorrType == Q2CorrType.Greece && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5)
+ if (q2CorrType == Q2CorrType.Greece && Math.Abs(q2adjResult.Error) <= 0.5)
{
resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
return CommErr.None;
}
- q2CorrRL = (int)Math.Round(2.0 * q2Correction2);
- q2CorrLR = (int)Math.Round(1.0 * q2Correction2);
- }
- else if (q2CorrType == Q2CorrType.RL || q2CorrType == Q2CorrType.RL_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateRL) /// RL only
- {
- if (q2CorrType == Q2CorrType.RL && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5)
- {
- resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
- return CommErr.None;
- }
-
- q2CorrRL = (int)Math.Round(q2Correction);
+ q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom))));
+ q2CorrRL = q2CorrLR;
}
- else if (q2CorrType == Q2CorrType.LR || q2CorrType == Q2CorrType.LR_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateLR) /// LR only
+ else if (q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestRLDir)
{
- if (q2CorrType == Q2CorrType.LR && Math.Abs(q2adjResult.Error - ihead.CalibTargetQ2) <= 0.5)
- {
- resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
- return CommErr.None;
- }
-
- q2CorrLR = (int)Math.Round(q2Correction2);
- }
- else if ((q2CorrType == Q2CorrType.Update) || (q2CorrType == Q2CorrType.ConditionalUpdate))
- {
- q2CorrRL = (int)Math.Round(q2Correction);
- q2CorrLR = (int)Math.Round(q2Correction2);
+ ///
+ /// Another strange process
+ ///
+ double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error);
+ q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom, errorTarget))));
+ q2CorrLR = q2CorrRL;
}
@@ -2739,44 +2061,42 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
///
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
CommErr error = CommErr.Write;
- if (q2CorrType == Q2CorrType.RL || q2CorrType == Q2CorrType.RL_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateRL)
+
+ if (q2CorrType == Q2CorrType.Standard ||
+ q2CorrType == Q2CorrType.Standard_incl_05 ||
+ q2CorrType == Q2CorrType.Standard_plus_incl_05 ||
+ q2CorrType == Q2CorrType.RL ||
+ q2CorrType == Q2CorrType.RL_incl_05 ||
+ q2CorrType == Q2CorrType.ConditionalUpdateRL)
{
///
/// Write R-L Q2 correction factor only
///
byte[] wrData = new byte[1] { (byte)q2CorrRL };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrRL, wrData.Length, wrData))
{
- if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddrRL, wrData.Length, wrData, cfg.CommTimeout))
- {
- error = CommErr.None;
- wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL;
+ resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL);
+ error = CommErr.None;
}
}
- else if (q2CorrType == Q2CorrType.LR || q2CorrType == Q2CorrType.LR_incl_05 || q2CorrType == Q2CorrType.ConditionalUpdateLR)
+ else if (q2CorrType == Q2CorrType.Dewa ||
+ q2CorrType == Q2CorrType.Dewa_incl_05 ||
+ q2CorrType == Q2CorrType.Dewa_plus_incl_05 ||
+ q2CorrType == Q2CorrType.LR ||
+ q2CorrType == Q2CorrType.LR_incl_05 ||
+ q2CorrType == Q2CorrType.ConditionalUpdateLR)
{
///
/// Write L-R Q2 correction factor only
///
byte[] wrData = new byte[1] { (byte)q2CorrLR };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrLR, wrData.Length, wrData))
{
- if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddrLR, wrData.Length, wrData, cfg.CommTimeout))
- {
- error = CommErr.None;
- wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR;
+ resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR);
+ error = CommErr.None;
}
}
else
@@ -2785,24 +2105,49 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Write both Q2 correction factors
///
byte[] wrData = new byte[2] { (byte)q2CorrLR, (byte)q2CorrRL };
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData))
{
- if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
- {
- error = CommErr.None;
- wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL;
- wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL;
+ wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR;
+ resultStr = string.Format("Q2 correction: RL={0}, LR={1}", q2CorrRL, q2CorrLR);
+ error = CommErr.None;
}
}
- ///
- /// Verification disabled on 16.02.2016
- ///
+
+ ///
+ /// Q2 correction factor was successfully written to the water meter.
+ /// Check whether the original error at Q2 was within limits.
+ ///
+ if (error == CommErr.None &&
+ (q2adjResult.Error < errLimitLo || errLimitHi < q2adjResult.Error ||
+ (q2adjResult2 != null && (q2adjResult2.Error < errLimitLo || errLimitHi < q2adjResult2.Error))))
+ {
+ resultStr += " (OoR)";
+
+ /// At least one of Q2 errors is out of range for Q2 correction
+ log.WarnFormat("OoR => anyhow Q2 correction was done: Pos={0}, PCB#={1}, ***Q2_RL err={2}%***, ***Q2_LR err={3}%***, [Lo={4}%, Hi={5}%]",
+ ihead.Name,
+ ihead.SerialNr,
+ q2adjResult.Error.ToString("F2"),
+ q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty,
+ errLimitLo.ToString("F2"),
+ errLimitHi.ToString("F2"));
+
+ rfidDataLogger.InfoFormat("{0}({1}): Q2 error ({2},{3}) is out of range ({4}..{5}) => Failed",
+ ihead.Name,
+ ihead.SerialNr,
+ q2adjResult.Error.ToString("F2"),
+ q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty,
+ errLimitLo.ToString("F2"),
+ errLimitHi.ToString("F2"));
+
+ error = CommErr.Q2OutOfRange;
+ }
+
+ ///
+ /// Verification disabled on 16.02.2016
+ ///
#if false
if (error == CommErr.None)
{
@@ -2810,9 +2155,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read calibration
byte[] rdData = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout)) &&
+ if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData)) &&
(rdData != null) && (rdData.Length == 2) && (rdData[0] == q2CorrRFlow) && (rdData[1] == q2CorrLFlow))
{
error = CommErr.None;
@@ -2822,43 +2165,24 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
wm.Q2ErrWOCorrection = ihead.Q2ErrorWOCorrection;
if (q2CorrType != Q2CorrType.LR) wm.Q2CorrRFlow = ihead.Q2CorrRFlow = (int)(sbyte)q2CorrRFlow;
if (q2CorrType != Q2CorrType.RL) wm.Q2CorrLFlow = ihead.Q2CorrLFlow = (int)(sbyte)q2CorrLFlow;
- break;
}
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
- }
}
#else
+
+ if ((q2CorrType != Q2CorrType.Update) && (q2CorrType != Q2CorrType.ConditionalUpdate))
+ {
+ wm.Q2ErrWOCorrection = ihead.Q2ErrWOCorrection = q2adjResult.Error;
+ }
+
///
/// Update WaterMeter entity and IperlHead
///
if (error == CommErr.None)
{
- if (q2CorrType == Q2CorrType.RL)
- {
- resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL);
- }
- else if (q2CorrType == Q2CorrType.LR)
- {
- resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR);
- }
- else
- {
- resultStr = string.Format("Q2 correction: RL={0}, LR={1}", q2CorrRL, q2CorrLR);
- }
-
- rfidDataLogger.WarnFormat("{0}: {1}", ihead.Name, resultStr);
-
- if ((q2CorrType != Q2CorrType.Update) && (q2CorrType != Q2CorrType.ConditionalUpdate))
- {
- wm.Q2ErrWOCorrection = ihead.Q2ErrWOCorrection = q2adjResult.Error;
- }
+ rfidDataLogger.WarnFormat("{0}({1}): {2}", ihead.Name, ihead.SerialNr, resultStr);
}
#endif
- ClosePort(ihead); /// Close RFID port
-
return error;
}
@@ -2869,7 +2193,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr Write2HzCorrection(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr Write2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
@@ -2884,25 +2208,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
return CommErr.None;
}
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
CommErr error = CommErr.Write;
Byte hz2CorrectionByte = (byte)(hz2CorrectionFactor & 0x000000FF);
byte[] wrData = new byte[1] { hz2CorrectionByte };
- ///
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
- {
- error = CommErr.None;
- wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor;
- wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone = true;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ ///
+ if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData))
+ {
+ error = CommErr.None;
+ wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor;
+ wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone = true;
}
///
@@ -2915,9 +2230,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Read calibration
byte[] rdData = null;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
- {
- if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData, cfg.CommTimeout)) &&
+ if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData)) &&
(rdData != null) && (rdData.Length == 2) && (rdData[0] == hz2CorrectionByte))
{
error = CommErr.None;
@@ -2926,12 +2239,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
wm.Hz2Correction = ihead.Hz2CorrectionFactor = hz2CorrectionFactor;
wm.Diff2Hz8Hz = ihead.Diff2Hz8Hz;
wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone;
- break;
}
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
- }
}
#else
if (error == CommErr.None)
@@ -2944,57 +2252,63 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
#endif
- ClosePort(ihead); /// Close RFID port
-
return error;
}
-
///
/// DEWA rework.
///
/// iPERL head object
/// Water meter object
+ /// Arrow direction
/// String passed to caller
/// true on success
- static CommErr DewaRework(IperlHead ihead, Results.Entities.WaterMeter wm, FlowDir flowDir, ref string resultStr)
+ static CommErr DewaRework(IperlHead ihead, WaterMeter wm, FlowDir flowDir, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
- if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
-
byte arrow = (flowDir == FlowDir.L_R) ? (byte)1 : (byte)2; /// L-R is reverse flow (=1), R-L is forward flow (=2)(default)
- iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
+ List dataToBeWritten = new List
{
- new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"),
- new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)1 }, "System Status"),
- new iPerlDataWrite(MessageID.MetrologyMemory, 0x1985, new byte[] { arrow }, "Arrow"),
- new iPerlDataWrite(MessageID.MetrologyMemory, 0x199C, new byte[5], "Clear S/N"),
- new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
- new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"),
- new iPerlDataWrite(MessageID.MetrologyMemory, 0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current"),
- new iPerlDataWrite(MessageID.RadioPassthrough, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F,
- (byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D,
- (byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07,
- (byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted"),
+ new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), // ?????
+ new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 5:0x1985, new byte[] { arrow }, "Arrow"),
+ new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 28:0x199C, new byte[5], "Clear S/N"),
+ new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"),
+ new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 14:0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current")
};
+ // check meter status: 1-Idle, 2-Active, 3-Test, 4-End Of Life
+ if (0 == ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 1, 1, out byte[] rdData))
+ {
+ int eMeterState = (int)((SByte)rdData[0]);
+ switch (eMeterState)
+ {
+ case 1: // Idle -> Test -> Active
+ dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetTestMode }, "Set test mode"));
+ dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"));
+ break;
+ case 3: // Test Mode -> Active
+ dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"));
+ break;
+ }
+ }
+
+ dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status"));
+ dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, new byte[] { (byte)3 }, "WakeUpInterval"));
+ dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F,
+ (byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D,
+ (byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07,
+ (byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted"));
+
int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
int mask = 1;
foreach (var wData in dataToBeWritten)
{
bool isSuccessfullyWritten = false;
- for (int j = 0; j < cfg.MaxCommRetries; j++)
+ if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data))
{
- if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data, cfg.CommTimeout))
- {
- isSuccessfullyWritten = true;
- break;
- }
-
- /// Delay between retries
- if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
+ isSuccessfullyWritten = true;
}
if (!isSuccessfullyWritten)
@@ -3006,8 +2320,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
mask = (mask << 1); /// Adjust the mask for the next step
}
- ClosePort(ihead); /// Close RFID port
-
if (successfyllyWrittenFlags == 0)
{
/// Success
@@ -3026,27 +2338,182 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
}
+ ///
+ /// Start testing a sealed meter
+ ///
+ /// iPERL head object
+ /// Water meter object
+ /// String passed to caller
+ /// true on success
+ static CommErr StartTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr)
+ {
+ if (ihead.CommFailed) return CommErr.CommFailed;
- static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ Byte testModeConfig = 0xA0; /// Default value
+ ///
+ if (multiTestParams[currentActivityStep].Activity.Length > StartTestingSealedMetersStr.Length)
+ {
+ string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(StartTestingSealedMetersStr.Length + 1);
+ UInt16 byteVal;
+ if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255)
+ {
+ testModeConfig = (Byte)byteVal; /// Update with specified value
+ }
+ }
+
+ iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
+ {
+ new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), /// 0x5A=sealed, 0xA5=unsealed ??????
+ new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status"),
+ new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
+ new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
+ };
+
+ if (ihead.ConfigStruct != null) ihead.OrigTestModeConfig = ihead.ConfigStruct.TestModeConfig;
+
+ int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
+ int mask = 1;
+ foreach (var wData in dataToBeWritten)
+ {
+ bool isSuccessfullyWritten = false;
+ if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data))
+ {
+ isSuccessfullyWritten = true;
+ }
+
+ if (!isSuccessfullyWritten)
+ {
+ /// Communication failed in this step
+ successfyllyWrittenFlags = (successfyllyWrittenFlags | mask);
+ }
+
+ mask = (mask << 1); /// Adjust the mask for the next step
+ }
+
+ if (successfyllyWrittenFlags == 0)
+ {
+ /// Success
+ if (ihead.ConfigStruct != null)
+ {
+ ihead.ConfigStruct.MeterState = MeterState.Active;
+ ihead.ConfigStruct.TestModeConfig = (byte)0xA0;
+ }
+
+ resultStr = "OK";
+ return CommErr.None;
+ }
+ else
+ {
+ return CommErr.Write;
+ }
+ }
+
+ ///
+ /// End testing a sealed meter
+ ///
+ /// iPERL head object
+ /// Water meter object
+ /// String passed to caller
+ /// true on success
+ static CommErr EndTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr)
+ {
+ if (ihead.CommFailed) return CommErr.CommFailed;
+
+ Byte testModeConfig = (ihead.OrigTestModeConfig != 0) ? ihead.OrigTestModeConfig : (byte)0x80; /// Restore original value (default is 0x80)
+
+ iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
+ {
+ new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
+ new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
+ new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)0 }, "System Status"),
+ new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0x5A }, "Close Sealing") /// 0x5A=sealed, 0xA5=unsealed ??????
+ };
+
+ int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
+ int mask = 1;
+ foreach (var wData in dataToBeWritten)
+ {
+ bool isSuccessfullyWritten = false;
+ if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data))
+ {
+ isSuccessfullyWritten = true;
+ }
+
+ if (!isSuccessfullyWritten)
+ {
+ /// Communication failed in this step
+ successfyllyWrittenFlags = (successfyllyWrittenFlags | mask);
+ }
+
+ mask = (mask << 1); /// Adjust the mask for the next step
+ }
+
+ if (successfyllyWrittenFlags == 0)
+ {
+ /// Success
+ if (ihead.ConfigStruct != null)
+ {
+ ihead.ConfigStruct.MeterState = MeterState.Active;
+ ihead.ConfigStruct.TestModeConfig = (byte)0xA0;
+ }
+
+ resultStr = "OK";
+ return CommErr.None;
+ }
+ else
+ {
+ return CommErr.Write;
+ }
+ }
+
+ static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr)
{
if (!ProcessData.IsQ2PreCorrectionCalculated)
{
ProcessData.IsQ2PreCorrectionCalculated = true;
- commonWMType = ihead.WMType_ID;
- bool success = iPerlCommunicationSeq.GetQ2PreCorrectionsOrBackups(cfg, commonWMType,
+ /*bool success = iPerlCommunicationSeq.GetQ2PreCorrectionsOrBackups(cfg, wm.WMTypeId(),
out ProcessData.CalculatedQ2PreCorrectionLR,
- out ProcessData.CalculatedQ2PreCorrectionRL);
- }
- else if (ihead.WMType_ID != commonWMType)
- {
- resultStr = string.Format("Different WZ_Typ: {0} ({1} expected)", ihead.WMType_ID, commonWMType);
- return CommErr.WrongIPerlType;
+ out ProcessData.CalculatedQ2PreCorrectionRL);*/
}
resultStr = string.Format("Q2 pre-corrections: LR={0} RL={1}", ProcessData.CalculatedQ2PreCorrectionLR, ProcessData.CalculatedQ2PreCorrectionRL);
return CommErr.None;
}
+ static CommErr SetIperlCommMilestoneReached(TestMethod testMethod, ConditionID id, ref string resultStr)
+ {
+ if (id < ConditionID.A || id >= ConditionID.Count)
+ {
+ resultStr = Strings.Error;
+ return CommErr.WrongArguments;
+ }
+
+ testMethod.IperlCommMilestone[(int)id] = true;
+ resultStr = string.Format(SequenceConditionOp.ConditionNameFmt, id);
+ return CommErr.None;
+ }
+
+ static CommErr Simulate(IperlHead ihead, WaterMeter wm, ref string resultStr)
+ {
+ string[] arguments = multiTestParams[currentActivityStep].Activity.Split(new char[] { ' ' });
+
+ if (arguments.Length < 2 || arguments[1].ToLower() != "iperls") return CommErr.None;
+
+ if (ihead.CommFailed) return CommErr.CommFailed;
+
+ string[] pcbNrs = new string[] { "831232435539", "831232435562",
+ "831232435587", "831232432141",
+ "831232432497", "831232763641" };
+
+ if (wm.WMPosition > 0 && wm.WMPosition <= pcbNrs.Length)
+ {
+ ihead.SerialNr = wm.SerialNr = pcbNrs[wm.WMPosition - 1];
+ }
+
+ resultStr = string.Format("PCB Nr. = {0}", wm.SerialNr ?? "");
+ return CommErr.None;
+ }
+
#endif /// IPERL
#endregion
@@ -3214,9 +2681,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
if (meterRslt != null && iperlHeads[i] != null)
{
-#if ORACLE_DB
- meterRslt.WaterMeter.WaterMeterData.WMTypeId = iperlHeads[i].WMType_ID;
-#endif
meterRslt.WaterMeter.SerialNr = iperlHeads[i].SerialNr;
meterRslt.Passed = (!iperlHeads[i].CommFailed && !iperlHeads[i].Disabled);
meterRslt.TestDone = true;
@@ -3228,6 +2692,79 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
UiBridge.Bridge.OnTestCompleted(this, new UiBridge.TestCompletedEventArgs(string.Empty, null));
}
+#if IPERL
+ private MenuItem NewMenuItem(string text, string tag)
+ {
+ MenuItem menuItem = new MenuItem { Text = text, Tag = tag };
+ menuItem.Click += OnClick_Optical_Heads_Settings_Menu;
+ return menuItem;
+ }
+ private async void OnClick_Optical_Heads_Settings_Menu(object sender, EventArgs e)
+ {
+ MenuItem menuItem = (MenuItem)sender;
+ activityLabel.Text = menuItem.Text;
+ List tasks = new List();
+ foreach (var iHead in ProcessData.IperlHeads)
+ {
+ if (!checkBoxes[iHead.Position - 1].Checked)
+ {
+ if (iHead.Position - 1 < messages.Length) messages[iHead.Position - 1].Text = "";
+ continue;
+ }
+ messages[iHead.Position - 1].Text = $"COM{iHead.RfidComPortNr}";
+ Application.DoEvents(); // Refresh UI
+ tasks.Add(Task.Run(async () =>
+ {
+ string result = await ProcessTask(iHead, menuItem.Tag);
+ this.Invoke((Action)(() =>
+ {
+ messages[iHead.Position - 1].Text = result;
+ Application.DoEvents(); // Refresh UI
+ }));
+
+ }));
+
+ }
+ await Task.WhenAll(tasks);
+ }
+
+ private async Task ProcessTask(IperlHead iHead, object tag)
+ {
+ string txt = "";
+ switch (tag)
+ {
+ case "ReadPCB":
+ txt = OpticalHeadTest.ReadRequest_PCB(iHead);
+ break;
+ case "WriteRequestPort_u8_Customer_Text":
+ txt = OpticalHeadTest.WriteRequestPort_u8_Customer_Text(iHead);
+ break;
+ case "OpenSealing":
+ txt = OpticalHeadTest.OpenSealing(iHead);
+ break;
+ case "StartTestMode":
+ txt = OpticalHeadTest.SetTestMode(iHead);
+ break;
+ case "TurnOffTestMode":
+ txt = OpticalHeadTest.SetActiveMode(iHead);
+ break;
+ case "TurnOffRadio":
+ txt = OpticalHeadTest.TurnOffRadio(iHead);
+ break;
+ case "SetProductionMode":
+ txt = OpticalHeadTest.SetProductionMode(iHead);
+ break;
+ case "SetRFID":
+ txt = OpticalHeadTest.SetRfidMode(iHead);
+ break;
+ case "SetNFC":
+ txt = OpticalHeadTest.SetNfcMode(iHead);
+ break;
+ }
+ return txt;
+ }
+#endif /// IPERL
+
#region Check boxes edit mode support
private void checkBoxImage1_Click(object sender, EventArgs e) { ckbState[ckbIndex[0]] = checkBoxImage1.Checked; }
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs
index eeb828447..e87740ce6 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.designer.cs
@@ -178,54 +178,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
this.pictureBox3 = new System.Windows.Forms.PictureBox();
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.checkBoxImage1 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage2 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage3 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage4 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage5 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage6 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage7 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage8 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage9 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage10 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage11 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage12 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage13 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage14 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage15 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage16 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage17 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage18 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage19 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage20 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage21 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage22 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage23 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage24 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage25 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage26 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage27 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage28 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage29 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage30 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage31 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage32 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage33 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage34 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage35 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage36 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage37 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage38 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage39 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage40 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage41 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage42 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage43 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage44 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage45 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage46 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage47 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
- this.checkBoxImage48 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
this.saveButton = new System.Windows.Forms.Button();
this.samplePictureBox1 = new System.Windows.Forms.PictureBox();
this.samplePictureBox2 = new System.Windows.Forms.PictureBox();
@@ -233,6 +185,54 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
this.sampleLabel1 = new System.Windows.Forms.Label();
this.sampleLabel2 = new System.Windows.Forms.Label();
this.sampleLabel3 = new System.Windows.Forms.Label();
+ this.checkBoxImage48 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage47 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage46 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage45 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage44 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage43 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage42 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage41 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage40 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage39 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage38 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage37 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage36 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage35 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage34 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage33 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage32 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage31 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage30 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage29 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage28 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage27 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage26 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage25 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage24 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage23 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage22 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage21 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage20 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage19 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage18 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage17 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage16 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage15 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage14 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage13 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage12 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage11 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage10 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage9 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage8 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage7 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage6 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage5 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage4 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage3 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage2 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
+ this.checkBoxImage1 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage();
((System.ComponentModel.ISupportInitialize)(this.pictureBox48)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox47)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox46)).BeginInit();
@@ -281,57 +281,57 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).BeginInit();
this.SuspendLayout();
//
// wmTextBox2
@@ -2639,57 +2639,57 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx
index 5ee43624a..20987c220 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.resx
@@ -118,3508 +118,3460 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
+
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADr4AAA6+AepCscAAAA+KSURBVFhHdVh3lFz1ed04DSODAHVtU9ldrcqqCySKgTjH
- Nn/4nJycJM7JMSfEWNjGAVMMOAScABamGhxABRkJISFpVxISQkjbe2+zu1N2eu+97czO7Oze3O/JS0LT
- OVe/N++9mf3uV+73/X5FtbW1+DqEw2FEYlEFsVjsM0TjXBNxJFJJJNMpJJNciXQyhQwxlUgiN5VBNpNG
- NptFejqLVC6L+EwWsZkcIoUcEphFHAWkZguYnpvDHPhP/ivwv+kZYCoHZPKYS+WQjya/0j7B1xIQ4/1B
- H7xeL+x2Oxw2O3w+H++TUCSGUChCMglEo1Hl3VgkinQ8gSxJTZPMdCyOGL+PmTzyND4UCiCZTSGRz8Kf
- iiGFGQVpYmpuhrbmkMlkkM9kgXwBc7lZkCMK2VkUSESuv8rOryTgdrthc1hhd9pgNpsVTIyNo7e7B62t
- 7Qra2jrQ1dUDg8GAQCCAeDiCBElE/X4F2VgEc2kSiUcQctmRigbp3jxi0QBSmRjSuRTCqbCCxDSJF6b5
- nFbOFZDLTiOVSCNPIjMzs5hlUJKpKYTolC/a+iUCTqdTMVirVUOjmcBAXz862ztw8cLH+PD4Cbx/5BiO
- /PEojh07jlOnanHw4EHs378fFz86B82YCklGYyaTwuxUEjPJCDIhRiEVQSHiRy7oAhJBFJIB5LliNo25
- OaZZLoqp6ZiCaRJj2BQybq8H2dkZxJiCU7wjKRecnv6cvZ8j4PF4rnp7YgIjI0NoaWnChY/O4+h7R3Do
- wEEafxS1p+pw8uRpnDhxEocOHSaJUzh79iyOvHcYhw/sR92JE+htbYZLr8Fs2APEQkD0T5jUAB474LIB
- Xq5OExAmqXSYz0k07CZBvpeO0uUx5g9rgCmXJ6EAoxblGpzNwZqIfJmApIHD4YBarUZvby9TpAXHjx/D
- 8WMf4PChd5X14/MX0NTUgsbGZnzyyafo7RtAfWOD8v1zZ+tw6ZOPcfniedS9fwTHXnsZP/mbu/DjnTvx
- q9278V87d+PZdRvw+83b8d7Nt+Idru9s3Yk3tm3HS1u34L+JfXv24PzeB2A7ehRzQ4NAiFESB+TTTCGm
- 6NwUGFeE5qaVaHxGQIpQvC/53N/fj/r6enq1jumxnx4/jcuXPlXSqK2tDc3NrWhhDbR3dOFk3Rl88ukl
- DPCPDQ0NoLmpgUROo/7cGfSdOY33Hn0Ev9yxAz9bXozXKzfhzJY9eH9xOU5cvxIXlq5B3Q0lOH1TKY4v
- LcPhJSXYv6wMbywqxtMLbsRPv3Uj6h95HDM9PSTC6GTjyOWTsAWdSvEn51hPTK0iRW1YdFarFSqVigY2
- o66uDu8xJc6cqUVDQ4MSkeHhUaVoJQJCoKWjE30jI2jt7MCl+itobG5Ad3cnens60H7lItpPfQDT+bO4
- 9Njj2H/rnfho++1Q7f4e1BW7YCrZDE/ZNsQrdyPIz/byrbCsuxmWTbdDXb0b7RXb8GH5BrxWWoFXt98M
- eg4IeDHLNJudnUKcZKQ28nOzKAoGg595f2BgAJcuXWKBHsOBAwfQ19eHHnqgp6ubEehSCLS1d6Kzuwud
- vG5sbUFbRzu6+nrR1d+Ntm5Gpr0V/V1t0PW0YvLyeRiPv4/mB36O0xt2oWPVVhq7E6Flm5Er3o70TdVI
- 3FSJ1IoNCBOupevgWF4Ny+qt0NbciuYNO/FU0Z/jdxs3YaatlTUSxGwyrhR4LJ5EgaJVFKX8+TxeTGp1
- 6O7sUgr2j+8eVq7F8L6eXgz29inoJyQavb3dyrU8l/tCvK2nCy29XejuF9Jd6O1qxnh3M7SXP4aPhV57
- y524TCO9FbcD6+6E56/LEL9+DbBqO/IlGxG6sRzRpWuRXV2DcFk1rOVVUFdtQMu69Xhj2Qr8fg+/52SR
- ByOK2rJtIE+xKvK43EqTUo9PoKmhUSnWc2fOYmRoFEMDwxjuH8AQpXS4l+D1wIAYTELEMI0dHRxi/g+h
- hzXQOdSPvv5BJXK9fUyxzmbo+9pgPVcL7WNPobXmdgwt2QjD9RXA9u8it34PhooWIFS8Hv6VVUQF3EtK
- MbVhK6wrS2BcUwHN5q04VVKOZ1cUQ/PWAaoVZZbNjTV8NQIWkxlWs0VpVKIypz48iY62dkqpBmOj4xgb
- HlGMHBschmpoWJHXoZFB1gTJERKh7m5GZHQUw/yN0QEVxvqGMT4yCqtOjb76j2Gr/wT5kyfx6sJl0N36
- fTi2fweN1yzH4PIq5O75J7QtXAnD+h3QsNBVJWswXrIa7o1Mo1WVUFWtR/eOm/Hswhvw3C27GYEQZkKU
- XRrPKQRFhkk97FabkkJnqSp1p2sxTIPHx9UYG5sgCRUmCO2wCmrVGEbHRjA8TrBpDQ4PsXibcKW+Ef0k
- qlHroRkYh7ZHBdOoFuM9fRjraoGrswlgbzi+5zY07bwN+M0rwFMvoHZhMbL/+u/Ao88g+A/3Ag89Bvz0
- Fyj8kNf/+CNMlFcqpEx3/S1evvEm/HzJIkCvZUcjgVyebYJFrFVrFAImgxHnz32kREF6wSgNVI2PKZHR
- EJOMhqxjE+MYUV/F4OgIGlpacaWpldfj0KmNmBzUwNg7AdeIEbZBNTz8raiKmt7RDNWvHgfefAd/+OYi
- 9NzxPeC3b6Lw6304t3EX3l1WDux7BbVla3FuaTFG1m6CoXIrVCvXQrNlF+oqKvH44hvgOH+avSHAgS+D
- AgfDIjFQ0sioNyh633ClXlEkMXRcPQHNhBo6AaOhZZ1MaBgZnQYqjhpjGi0GRsbofaYNva/TmmAY0sPa
- Nwn3gBHuwUloOjuRM+sx1XgZB+68A4lnnsfZ9dvQtOsu4MW3gFf3I/3kc+i/5+8VcnjhZSTvvR/40V74
- ttwG9ZLVUK+twflVa/D0TQvR++aLHE2EAMcQdmklAmK8jsY0NzahjR41mUzQTuqg009Cr5uEkTBpJ2Fg
- msk9jQJ+Z9IAg94CvcECzaTMTxaYx22wj5rhGbHAM6pH2GDCrNWEmdYmtP9kL/D6/+Dw9cug+c7fIX3/
- I8BLb+PT9TtxkaTwzAuoW7EKDSWV0FdshWP1ZhgXr2Uxb8bF0tV48rprYfrgEEcNEuBokc9NoUiMl/QR
- FRLjpYClLiQKAnlmNZpgoyGyGo1GGExGrmaSM8BqsDGCVDGdibDApHfBprXDNmJAwupmPbCTejnvMIpH
- 9tyBvjvvAZ54njXwW9RdswR44BHK6xp0rtsC7H0I3RWbMbymBubVm+Au2wgnC91etQOfllfj0W9ei9Dl
- C8x/duVkGJlsEkVSvEJC0ki0v4sdVqIxXxcKSMhCb1t4rdfrYbPZ4HO44Le54TG5YNFboTVaobM6YLR5
- YDE7ScwCB3/XY9QhZ5wEqx6qe/fixLdWwLntbrRfsxjq5WuhK63E2PJVUBVXYKSEWFGBydJqeFfV0PgK
- OFesh6Z8M07x+X1/9pcAx3zk0lSgLHIzmasyqnicGBoYVMZnISD9QUi4HE4FTl47LNwjyD32DY+ZJEw2
- eA122E1iuBN6Fzu62wsTV7vTAbNBg5ibfzBC1bjUiKP0qunm70K3bB3i1bsQY6H6S9fCT7UJVW1hk6uB
- vWw93IxAlLJqZW/wVO3CwNpteP4vFuLsv9wH7q4QZUQjMe4jMoyA1+1R8lxSSAp2nFIpa4Dd2UcSQkTe
- 8ThoNOHzuuG22+A3WxFk6oTMDkbDA6vPC73fp8Dk88DBcTnscyi5islJeF/+Az4s3YjhUs5BnH1CxdWI
- 0vOR5ezIJBFbVQ0PvW9dvAaWFeugZ1MzVG5GV0kVDi5YjAe/sQCJC5fZyBLKhic7O6vs5JRRQrwvei+p
- JMar2IQ89HrQ61O8L51ajPa5nAj4vfDSuxGmUMzuQtzhRdjrh4PbRwMHLr2fZAIeeMV4mesjnCQppc3/
- fB/ad94N+7a7oOHYEKayRFdXIcTi9K0sh6+sCgHmv3f1dhhXbYZu4w5MfvtuvFj0DbywZDm6n3galD3M
- hWLITOXh5ywUzUyjKMFtmnRiiYDku8iqpJJRb0IoEIb/TyTEeL+bee9zkRgN524pzq1nnCkTovddNNoa
- 5P457IcvEsBMikMXw4ygHy5294Nbb0HLzm+ji1OmnWO1qXoTbIRpbSW07LwGpo+jZg/MG2/DQMV2XKys
- wb6FC/FLKs8HP6TEqscoBm4UZIjjDOTkTBRMUoUkApImZiqMREJSaIQjg3pcQ+MDkOeCBPM4EvDDH3Aj
- zPk8EfApJGIet0LAw3ueeBDBFDf33Atzx8/dVRxRDnY/q1qHt2u2oXH3XXj/ukXo4IB2uawUV8pLUF9S
- SpSjqWwdLpdUo27RGhy6sRTPL1qBR4qXo+7Bf0O8u4GTKCOaSyLkdCkE0hzmksTVDQ3nC/G0KJLSeZlG
- MkbodHplUk0luDlPy3FJHBFuyqOxIHd8BD0tiHPXFJ+K8QeTyEynUBACkRjcVLW9e3bjB9ctwMPXL8Qb
- xSV4a+liPFtUhNeWXIeXFl2LfQuuwe8WXIdXSOz5v7oBvxEsLsPTG2pgOHoYBT27eI6Oc3C/HWdNUoX8
- vjBLYRrRKY4SQkAQj8YU9ZFUEq0XAt3dvay/SeXIJJ+ZQo7tO5VKcBYPYSodJ6mEghy7Yh45DojcZOSn
- kUvEkHN5ceyFfXj7oYfR+eYbuPjgL9D3+KNoe+DHsL30HBofvJ95/TAG/+NJ4tcYZI73PfGfsL7+NlDP
- 2Z9qB68DUz4jUnEHAkEzonEPZvIZ2hNHiiH4bEs5D9nYWCwWel7HYY6jBCEbfI3mareWnZuc3cxwBpmb
- KyjnPTM0WEbDAhVhKpuGbJBsbHRW1QSSNgcKftaDy4VZSjB//KphNl6zl4B1BT6j5vIzU8TOeZ+KBqcP
- GdZX1O1EyEsEmap0WiIZQTx+9ZBt3ubPERDIsYpsLyUKWq1WITBPRojJqYWQlMMuOdSKRCJKY5MGJ+/L
- KqoVFBWzU2JpuJ9Gy3VADsf4WVZBiO+EmdOCCOswzjROBYJIc1yWtA6F/g+y9ZW/9/+NF3yJgEA8LdEQ
- EjKZivFjY2PKKtEQQyW15iHE5L6sMkfZaKTDYmbDs7IBsiPzWmRY5FdWgfQUUbUARUAgQiCQ6yDFIcjI
- STTFcHGSGC/4oq1fSUAgX3QxvOJtITJvqHh4HnIIIBGSdyRy8r4czcj7cihmNhsZKSsjJBEjKYeN77Gn
- MDUEXsriPAJUNR8boMvloPNILHCVgHhfCHzR8/P4WgICISE/IGeikjLiXTFcvC2REcMlfeS+XM+TldVM
- z5voeaOZQyA9LqOFhRERyImbfHYyAjZGQuCRXkLvy315Pu/9eXyVfbW1tfhfX0YT2Lth7dgAAAAASUVO
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADr4AAA6+AepCscAAAA+KSURBVFhHdVh3lFz1ed04DSODAHVtU9ldrcqqCySKgTjH
- Nn/4nJycJM7JMSfEWNjGAVMMOAScABamGhxABRkJISFpVxISQkjbe2+zu1N2eu+97czO7Oze3O/JS0LT
- OVe/N++9mf3uV+73/X5FtbW1+DqEw2FEYlEFsVjsM0TjXBNxJFJJJNMpJJNciXQyhQwxlUgiN5VBNpNG
- NptFejqLVC6L+EwWsZkcIoUcEphFHAWkZguYnpvDHPhP/ivwv+kZYCoHZPKYS+WQjya/0j7B1xIQ4/1B
- H7xeL+x2Oxw2O3w+H++TUCSGUChCMglEo1Hl3VgkinQ8gSxJTZPMdCyOGL+PmTzyND4UCiCZTSGRz8Kf
- iiGFGQVpYmpuhrbmkMlkkM9kgXwBc7lZkCMK2VkUSESuv8rOryTgdrthc1hhd9pgNpsVTIyNo7e7B62t
- 7Qra2jrQ1dUDg8GAQCCAeDiCBElE/X4F2VgEc2kSiUcQctmRigbp3jxi0QBSmRjSuRTCqbCCxDSJF6b5
- nFbOFZDLTiOVSCNPIjMzs5hlUJKpKYTolC/a+iUCTqdTMVirVUOjmcBAXz862ztw8cLH+PD4Cbx/5BiO
- /PEojh07jlOnanHw4EHs378fFz86B82YCklGYyaTwuxUEjPJCDIhRiEVQSHiRy7oAhJBFJIB5LliNo25
- OaZZLoqp6ZiCaRJj2BQybq8H2dkZxJiCU7wjKRecnv6cvZ8j4PF4rnp7YgIjI0NoaWnChY/O4+h7R3Do
- wEEafxS1p+pw8uRpnDhxEocOHSaJUzh79iyOvHcYhw/sR92JE+htbYZLr8Fs2APEQkD0T5jUAB474LIB
- Xq5OExAmqXSYz0k07CZBvpeO0uUx5g9rgCmXJ6EAoxblGpzNwZqIfJmApIHD4YBarUZvby9TpAXHjx/D
- 8WMf4PChd5X14/MX0NTUgsbGZnzyyafo7RtAfWOD8v1zZ+tw6ZOPcfniedS9fwTHXnsZP/mbu/DjnTvx
- q9278V87d+PZdRvw+83b8d7Nt+Idru9s3Yk3tm3HS1u34L+JfXv24PzeB2A7ehRzQ4NAiFESB+TTTCGm
- 6NwUGFeE5qaVaHxGQIpQvC/53N/fj/r6enq1jumxnx4/jcuXPlXSqK2tDc3NrWhhDbR3dOFk3Rl88ukl
- DPCPDQ0NoLmpgUROo/7cGfSdOY33Hn0Ev9yxAz9bXozXKzfhzJY9eH9xOU5cvxIXlq5B3Q0lOH1TKY4v
- LcPhJSXYv6wMbywqxtMLbsRPv3Uj6h95HDM9PSTC6GTjyOWTsAWdSvEn51hPTK0iRW1YdFarFSqVigY2
- o66uDu8xJc6cqUVDQ4MSkeHhUaVoJQJCoKWjE30jI2jt7MCl+itobG5Ad3cnens60H7lItpPfQDT+bO4
- 9Njj2H/rnfho++1Q7f4e1BW7YCrZDE/ZNsQrdyPIz/byrbCsuxmWTbdDXb0b7RXb8GH5BrxWWoFXt98M
- eg4IeDHLNJudnUKcZKQ28nOzKAoGg595f2BgAJcuXWKBHsOBAwfQ19eHHnqgp6ubEehSCLS1d6Kzuwud
- vG5sbUFbRzu6+nrR1d+Ntm5Gpr0V/V1t0PW0YvLyeRiPv4/mB36O0xt2oWPVVhq7E6Flm5Er3o70TdVI
- 3FSJ1IoNCBOupevgWF4Ny+qt0NbciuYNO/FU0Z/jdxs3YaatlTUSxGwyrhR4LJ5EgaJVFKX8+TxeTGp1
- 6O7sUgr2j+8eVq7F8L6eXgz29inoJyQavb3dyrU8l/tCvK2nCy29XejuF9Jd6O1qxnh3M7SXP4aPhV57
- y524TCO9FbcD6+6E56/LEL9+DbBqO/IlGxG6sRzRpWuRXV2DcFk1rOVVUFdtQMu69Xhj2Qr8fg+/52SR
- ByOK2rJtIE+xKvK43EqTUo9PoKmhUSnWc2fOYmRoFEMDwxjuH8AQpXS4l+D1wIAYTELEMI0dHRxi/g+h
- hzXQOdSPvv5BJXK9fUyxzmbo+9pgPVcL7WNPobXmdgwt2QjD9RXA9u8it34PhooWIFS8Hv6VVUQF3EtK
- MbVhK6wrS2BcUwHN5q04VVKOZ1cUQ/PWAaoVZZbNjTV8NQIWkxlWs0VpVKIypz48iY62dkqpBmOj4xgb
- HlGMHBschmpoWJHXoZFB1gTJERKh7m5GZHQUw/yN0QEVxvqGMT4yCqtOjb76j2Gr/wT5kyfx6sJl0N36
- fTi2fweN1yzH4PIq5O75J7QtXAnD+h3QsNBVJWswXrIa7o1Mo1WVUFWtR/eOm/Hswhvw3C27GYEQZkKU
- XRrPKQRFhkk97FabkkJnqSp1p2sxTIPHx9UYG5sgCRUmCO2wCmrVGEbHRjA8TrBpDQ4PsXibcKW+Ef0k
- qlHroRkYh7ZHBdOoFuM9fRjraoGrswlgbzi+5zY07bwN+M0rwFMvoHZhMbL/+u/Ao88g+A/3Ag89Bvz0
- Fyj8kNf/+CNMlFcqpEx3/S1evvEm/HzJIkCvZUcjgVyebYJFrFVrFAImgxHnz32kREF6wSgNVI2PKZHR
- EJOMhqxjE+MYUV/F4OgIGlpacaWpldfj0KmNmBzUwNg7AdeIEbZBNTz8raiKmt7RDNWvHgfefAd/+OYi
- 9NzxPeC3b6Lw6304t3EX3l1WDux7BbVla3FuaTFG1m6CoXIrVCvXQrNlF+oqKvH44hvgOH+avSHAgS+D
- AgfDIjFQ0sioNyh633ClXlEkMXRcPQHNhBo6AaOhZZ1MaBgZnQYqjhpjGi0GRsbofaYNva/TmmAY0sPa
- Nwn3gBHuwUloOjuRM+sx1XgZB+68A4lnnsfZ9dvQtOsu4MW3gFf3I/3kc+i/5+8VcnjhZSTvvR/40V74
- ttwG9ZLVUK+twflVa/D0TQvR++aLHE2EAMcQdmklAmK8jsY0NzahjR41mUzQTuqg009Cr5uEkTBpJ2Fg
- msk9jQJ+Z9IAg94CvcECzaTMTxaYx22wj5rhGbHAM6pH2GDCrNWEmdYmtP9kL/D6/+Dw9cug+c7fIX3/
- I8BLb+PT9TtxkaTwzAuoW7EKDSWV0FdshWP1ZhgXr2Uxb8bF0tV48rprYfrgEEcNEuBokc9NoUiMl/QR
- FRLjpYClLiQKAnlmNZpgoyGyGo1GGExGrmaSM8BqsDGCVDGdibDApHfBprXDNmJAwupmPbCTejnvMIpH
- 9tyBvjvvAZ54njXwW9RdswR44BHK6xp0rtsC7H0I3RWbMbymBubVm+Au2wgnC91etQOfllfj0W9ei9Dl
- C8x/duVkGJlsEkVSvEJC0ki0v4sdVqIxXxcKSMhCb1t4rdfrYbPZ4HO44Le54TG5YNFboTVaobM6YLR5
- YDE7ScwCB3/XY9QhZ5wEqx6qe/fixLdWwLntbrRfsxjq5WuhK63E2PJVUBVXYKSEWFGBydJqeFfV0PgK
- OFesh6Z8M07x+X1/9pcAx3zk0lSgLHIzmasyqnicGBoYVMZnISD9QUi4HE4FTl47LNwjyD32DY+ZJEw2
- eA122E1iuBN6Fzu62wsTV7vTAbNBg5ibfzBC1bjUiKP0qunm70K3bB3i1bsQY6H6S9fCT7UJVW1hk6uB
- vWw93IxAlLJqZW/wVO3CwNpteP4vFuLsv9wH7q4QZUQjMe4jMoyA1+1R8lxSSAp2nFIpa4Dd2UcSQkTe
- 8ThoNOHzuuG22+A3WxFk6oTMDkbDA6vPC73fp8Dk88DBcTnscyi5islJeF/+Az4s3YjhUs5BnH1CxdWI
- 0vOR5ezIJBFbVQ0PvW9dvAaWFeugZ1MzVG5GV0kVDi5YjAe/sQCJC5fZyBLKhic7O6vs5JRRQrwvei+p
- JMar2IQ89HrQ61O8L51ajPa5nAj4vfDSuxGmUMzuQtzhRdjrh4PbRwMHLr2fZAIeeMV4mesjnCQppc3/
- fB/ad94N+7a7oOHYEKayRFdXIcTi9K0sh6+sCgHmv3f1dhhXbYZu4w5MfvtuvFj0DbywZDm6n3galD3M
- hWLITOXh5ywUzUyjKMFtmnRiiYDku8iqpJJRb0IoEIb/TyTEeL+bee9zkRgN524pzq1nnCkTovddNNoa
- 5P457IcvEsBMikMXw4ygHy5294Nbb0HLzm+ji1OmnWO1qXoTbIRpbSW07LwGpo+jZg/MG2/DQMV2XKys
- wb6FC/FLKs8HP6TEqscoBm4UZIjjDOTkTBRMUoUkApImZiqMREJSaIQjg3pcQ+MDkOeCBPM4EvDDH3Aj
- zPk8EfApJGIet0LAw3ueeBDBFDf33Atzx8/dVRxRDnY/q1qHt2u2oXH3XXj/ukXo4IB2uawUV8pLUF9S
- SpSjqWwdLpdUo27RGhy6sRTPL1qBR4qXo+7Bf0O8u4GTKCOaSyLkdCkE0hzmksTVDQ3nC/G0KJLSeZlG
- MkbodHplUk0luDlPy3FJHBFuyqOxIHd8BD0tiHPXFJ+K8QeTyEynUBACkRjcVLW9e3bjB9ctwMPXL8Qb
- xSV4a+liPFtUhNeWXIeXFl2LfQuuwe8WXIdXSOz5v7oBvxEsLsPTG2pgOHoYBT27eI6Oc3C/HWdNUoX8
- vjBLYRrRKY4SQkAQj8YU9ZFUEq0XAt3dvay/SeXIJJ+ZQo7tO5VKcBYPYSodJ6mEghy7Yh45DojcZOSn
- kUvEkHN5ceyFfXj7oYfR+eYbuPjgL9D3+KNoe+DHsL30HBofvJ95/TAG/+NJ4tcYZI73PfGfsL7+NlDP
- 2Z9qB68DUz4jUnEHAkEzonEPZvIZ2hNHiiH4bEs5D9nYWCwWel7HYY6jBCEbfI3mareWnZuc3cxwBpmb
- KyjnPTM0WEbDAhVhKpuGbJBsbHRW1QSSNgcKftaDy4VZSjB//KphNl6zl4B1BT6j5vIzU8TOeZ+KBqcP
- GdZX1O1EyEsEmap0WiIZQTx+9ZBt3ubPERDIsYpsLyUKWq1WITBPRojJqYWQlMMuOdSKRCJKY5MGJ+/L
- KqoVFBWzU2JpuJ9Gy3VADsf4WVZBiO+EmdOCCOswzjROBYJIc1yWtA6F/g+y9ZW/9/+NF3yJgEA8LdEQ
- EjKZivFjY2PKKtEQQyW15iHE5L6sMkfZaKTDYmbDs7IBsiPzWmRY5FdWgfQUUbUARUAgQiCQ6yDFIcjI
- STTFcHGSGC/4oq1fSUAgX3QxvOJtITJvqHh4HnIIIBGSdyRy8r4czcj7cihmNhsZKSsjJBEjKYeN77Gn
- MDUEXsriPAJUNR8boMvloPNILHCVgHhfCHzR8/P4WgICISE/IGeikjLiXTFcvC2REcMlfeS+XM+TldVM
- z5voeaOZQyA9LqOFhRERyImbfHYyAjZGQuCRXkLvy315Pu/9eXyVfbW1tfhfX0YT2Lth7dgAAAAASUVO
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
-
-
-
-
- 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
- RK5CYII=
+ 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
- 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
- RK5CYII=
+ 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
-
+
- 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
- RK5CYII=
+ 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
\ No newline at end of file
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs
index 2817a65df..ddf2df0f1 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs
@@ -65,6 +65,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionLRStr);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionIncl05Str);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionAltIncl05Str);
+ retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionPlusIncl05Str);
+ retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionPlusAltIncl05Str);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionGreeceIncl05Str);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionRLIncl05Str);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionLRIncl05Str);
@@ -86,9 +88,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
retVal.Add(iPerlCommunicationForm.Write2HzCorrectionStr);
retVal.Add(iPerlCommunicationForm.DewaReworkRLStr);
retVal.Add(iPerlCommunicationForm.DewaReworkLRStr);
+ retVal.Add(iPerlCommunicationForm.StartTestingSealedMetersStr);
+ retVal.Add(iPerlCommunicationForm.EndTestingSealedMetersStr);
retVal.Add(string.Format("{0} if enabled", iPerlCommunicationForm.ReadConfigurationStr));
retVal.Add(string.Format("{0} 80", iPerlCommunicationForm.SetTestModeStr));
retVal.Add("iPerl_check prevWorkStep direction q2factors");
+ for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++)
+ {
+ retVal.Add(string.Format(SequenceConditionOp.ConditionNameFmt, id));
+ }
+
return retVal;
}
else
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
index 2c37b6795..9259dc19c 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2015-2022 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2023 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -11,6 +11,9 @@ using RestClient;
using TBF.Rig.Sequences;
using TBF.Resources;
using TBF.UiBridge;
+using Results;
+using Results.Entities;
+using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
namespace TBF.Rig.TestMethods.iPerlCommunication
{
@@ -22,15 +25,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public const string StrictQ2ErrorCheckStr = "Strict Q2 error check ";
public const string Q2correctionCheckCmd = "Q2 correction check ";
public const string IperlCheckCmd = "iPERL_check ";
+ public const string SimulateCmd = "simulate ";
- System.Windows.Forms.Form modelessDlg;
+ System.Windows.Forms.Form modelessDlg;
///
- delegate void iPerlCommFormDlgt(iPerlCommunicationSeq myRef, TestMethodCfg cfg, Test test, iPerlCommunicationParams testParams);
+ delegate void iPerlCommFormDlgt(iPerlCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams);
///
- void OpenIPerlCommForm(iPerlCommunicationSeq myRef, TestMethodCfg cfg, Test test, iPerlCommunicationParams testParams)
+ void OpenIPerlCommForm(iPerlCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams)
{
- myRef.modelessDlg = new iPerlCommunicationForm(cfg, test, testParams);
+ myRef.modelessDlg = new iPerlCommunicationForm(method, test, testParams);
myRef.modelessDlg.Show();
}
@@ -52,8 +56,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Event.OpArgumentError . Target flow is out of range
/// Event.Error . . . . . . Unspecified error
///
- public IList Execute(Test test, int repetitionNr, TestMethodCfg cfg, iPerlCommunicationParams testParams)
+ public IList Execute(Test test, int repetitionNr, TestMethod method, iPerlCommunicationParams testParams)
{
+ TestMethodCfg cfg = method.Cfg as TestMethodCfg;
+
IList e; /// Events from currently running operations
checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state
modelessDlg = null;
@@ -69,17 +75,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// Get 'wmType' from IperlHead procedure parameters
int wmType = 0;
- if (IperlHeads != null)
+#if IPERL
+ /*foreach (var wm in ProcessData.BatchRslts.Batch.WaterMeters)
{
- foreach (var ih in IperlHeads)
+ if (wm != null && !wm.Disabled && wm.WMTypeId() > 0)
{
- if (ih.WMType_ID > 0)
- {
- wmType = ih.WMType_ID;
- break;
- }
+ wmType = wm.WMTypeId();
+ break;
}
- }
+ }*/
+#endif
if (cfg.UseWebService)
{
@@ -121,9 +126,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted));
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting));
- string fromTestName = testParams.Activity.Substring(cmd.Length);
-
- MakeQ2CorrectedFrom(test.Name, fromTestName);
+ string[] args = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' });
+ string fromTestName = (args.Length >= 1) ? args[0] : string.Empty;
+ bool isPlus = (args.Length >= 2) ? args[1].ToLower().Contains("plus") : false;
+ MakeQ2CorrectedFrom(test.Name, fromTestName, isPlus);
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.Completed));
Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(test.Name, 0)));
@@ -174,9 +180,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
string[] args = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' });
- int maxTestIndex = (ProcessData.BenchInfo is DataContainer.iPerlBenchInfo.Component)
- ? (ProcessData.BenchInfo as DataContainer.iPerlBenchInfo.Component).MaxTestIndex
- : int.MaxValue;
+ //int maxTestIndex = (ProcessData.BenchInfo is TBF.Rig.DataContainer.BenchInfo.Component)
+ // ? (ProcessData.BenchInfo as TBF.Rig.DataContainer.BenchInfo.Component).MaxTestIndex
+ // : int.MaxValue;
Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, 0);
@@ -285,7 +291,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
return new List { Event.Done };
}
- else if (testParams.Activity.ToLower().Contains(cmd = "simulate "))
+ else if (testParams.Activity.ToLower().Contains(cmd = SimulateCmd))
{
TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 });
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted));
@@ -298,9 +304,49 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound nok") MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f);
else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound rise") MakeSimulatedCompound(test, 1, 0, 0.7f, 0.0f);
else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound fall") MakeSimulatedCompound(test, 1, 0, 0.7f, 0.9f);
+ else if (testParams.Activity.Substring(cmd.Length).ToLower() == "iperls")
+ {
+ string[] pcbNrs = new string[] { "831232435539", "831232435562", "831232435587",
+ "831232432141", "831232432497", "831232763641" };
+
+ TestRslt tstRslt = BatchRslts.GetTestRslt(test.Name, test.Part);
+ if (tstRslt != null)
+ {
+ Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters);
+
+ /// Auxiliary results ... not required
+
+ /// Main results
+ tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName;
+ tstRslt.TestDone = true;
+ tstRslt.StartTime = tstRslt.Batch.StartTime;
+ tstRslt.EndTime = DateTime.Now;
+ tstRslt.FlowSetTime = 0;
+ tstRslt.MassOfEvapWater = 0;
+ tstRslt.TestTime = 1;
+
+ for (int i = 0; i < BatchRslts.Batch.WaterMeters.Count; i++)
+ {
+ MeterTestRslt meterRslt =
+ BatchRslts.GetMeterTestRslt(test.Name, i, CompoundMeterId.Single);
+
+ if (meterRslt != null)
+ {
+ meterRslt.WaterMeter.SerialNr = pcbNrs[i % pcbNrs.Length];
+ meterRslt.Passed = true;
+ meterRslt.TestDone = true;
+ }
+ //if (iperlHeads[i] != null)
+ //{
+ // iperlHeads[i].CommFailed = iperlHeads[i].Disabled = false;
+ // iperlHeads[i].SerialNr = pcbNrs[i % pcbNrs.Length];
+ //}
+ }
+ }
+ }
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.Completed));
- Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0)));
+ Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Common.Utils.GetTestName(test.Name, 1, 1), 0)));
allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file
//------------------------------------------------
@@ -308,8 +354,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
//------------------------------------------------
State.Create(string.Format("iPerlCommunicationSeq : {0}", testParams.Activity))
- .AddOperation(checkUiOp)
- .EnterState();
+ .AddOperation(checkUiOp)
+ .EnterState();
e = StateMachine.WaitRunDevsRunOps();
if (TestAndLogUiCmdStop(test, e))
@@ -322,7 +368,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
///
/// Show the modeless dialog with error indication
///
- Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, cfg, test, testParams });
+ Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, method, test, testParams });
//------------------------------------------------
Bridge.OnActivity(this, Strings.iPerl_Communication_in_progress);
@@ -332,10 +378,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
bool completed = false;
State.Create("iPerlCommunicationSeq : Wait until the entry form is closed")
- .AddOperation(checkUiOp)
- .EnterState();
- do
- {
+ .AddOperation(checkUiOp)
+ .EnterState();
+ do {
e = StateMachine.WaitRunDevsRunOps();
stopPressed = TestAndLogUiCmdStop(test, e);
completed = (modelessDlg is GenericDevices.IHasCompleted)
@@ -475,7 +520,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
/// This test name
/// Name of Q2 test done before Q2 correction (Q2adj)
/// Assuming this test does not have multiple parts (part = 0)
- void MakeQ2CorrectedFrom(string testName, string oriTestName)
+ void MakeQ2CorrectedFrom(string testName, string oriTestName, bool isPlus = false)
{
Results.Entities.TestRslt oriTestRslt = ProcessData.BatchRslts.GetTestRslt(oriTestName, 0);
Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, 0);
@@ -551,8 +596,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
tstRslt.MassEndRaw = oriTestRslt.MassEndRaw;
tstRslt.MassEnd = oriTestRslt.MassEnd;
tstRslt.MassOfEvapWater = oriTestRslt.MassOfEvapWater;
- tstRslt.Qdetected = oriTestRslt.Qdetected;
- tstRslt.Flow = oriTestRslt.Flow;
+ //tstRslt.FlowMass = oriTestRslt.FlowMass;
+ //tstRslt.FlowVolume = oriTestRslt.FlowVolume;
tstRslt.VolumeCTV = oriTestRslt.VolumeCTV;
tstRslt.VolumeMaster = oriTestRslt.VolumeMaster;
tstRslt.ErrorMaster = oriTestRslt.ErrorMaster;
@@ -572,15 +617,19 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
for (int i = 0; i < ProcessData.BatchRslts.WMPositionsCount; i++)
{
- Results.Entities.MeterTestRslt oriMeterRslt = ProcessData.BatchRslts.GetMeterTestRslt(oriTestName, i, CompoundMeterId.Single);
- Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single);
+ // Fix for CS7036: Added the missing 'meterId' argument to the GetMeterTestRslt method call.
+ var q3mtr = ProcessData.BatchRslts.GetMeterTestRslt("Q3", i, CompoundMeterId.SingleOrCompound);
+ double q3error = (q3mtr != null) ? q3mtr.Error : 0;
+
+ Results.Entities.MeterTestRslt oriMeterRslt = ProcessData.BatchRslts.GetMeterTestRslt(oriTestName, i, CompoundMeterId.SingleOrCompound);
+ Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.SingleOrCompound);
/// Reference to iPerl water meter or null:
TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath != null) && (sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length))
? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead)
: null;
- if (meterRslt != null && oriMeterRslt != null)
+ if (iPerl != null && meterRslt != null && oriMeterRslt != null)
{
#if ORACLE_DB
meterRslt.ErrorBC = oriMeterRslt.Error;
@@ -591,33 +640,27 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
meterRslt.VolumeRef = oriMeterRslt.VolumeRef;
meterRslt.TestTime = oriMeterRslt.TestTime;
- if (iPerl == null || ((iPerl.Q2CorrRL == 0) && (iPerl.Q2CorrLR == 0)))
+ if (q3error * oriMeterRslt.Error < 0)
{
- /// Either no iPerl head or no Q2 correction
- meterRslt.Error = oriMeterRslt.Error;
- meterRslt.VolumeMeter = oriMeterRslt.VolumeMeter;
- meterRslt.VolumeStart = oriMeterRslt.VolumeStart;
- meterRslt.VolumeEnd = oriMeterRslt.VolumeEnd;
- meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin()
- && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin());
- meterRslt.TestDone = true;
- tstRslt.TestDone = true;
+ /// iPerl with Q2 correction => generate an artificial error equal to +1/10 of the original one (relative to Q2 target error)
+ meterRslt.Error = 0.1 * oriMeterRslt.Error;
}
else
{
/// iPerl with Q2 correction => generate an artificial error equal to -1/10 of the original one (relative to Q2 target error)
- double targetError = iPerl.CalibTargetQ2;
- meterRslt.Error = targetError - 0.1 * (oriMeterRslt.Error - targetError);
- meterRslt.VolumeMeter = oriMeterRslt.VolumeRef * (100.0 + meterRslt.Error) / 100.0;
- meterRslt.VolumeStart = oriMeterRslt.VolumeStart;
- double signature = (oriMeterRslt.VolumeEnd > oriMeterRslt.VolumeStart) ? (+1) : (-1);
- meterRslt.VolumeEnd = meterRslt.VolumeStart + signature * meterRslt.VolumeMeter;
- meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin()
- && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin());
- meterRslt.TestDone = true;
- tstRslt.TestDone = true;
+ meterRslt.Error = - 0.1 * oriMeterRslt.Error;
}
- }
+
+ meterRslt.VolumeMeter = meterRslt.VolumeRef * (100.0 + meterRslt.Error) / 100.0;
+ double signature = (oriMeterRslt.VolumeEnd > oriMeterRslt.VolumeStart) ? (+1) : (-1);
+ meterRslt.VolumeStart = oriMeterRslt.VolumeStart;
+ meterRslt.VolumeEnd = meterRslt.VolumeStart + signature * meterRslt.VolumeMeter;
+
+ meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin()
+ && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin());
+ meterRslt.TestDone = true;
+ tstRslt.TestDone = true;
+ }
}
}
@@ -703,8 +746,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
tstRslt.MassEndRaw = oriTestRslt.MassEndRaw;
tstRslt.MassEnd = oriTestRslt.MassEnd;
tstRslt.MassOfEvapWater = oriTestRslt.MassOfEvapWater;
- tstRslt.Qdetected = oriTestRslt.Qdetected;
- tstRslt.Flow = oriTestRslt.Flow;
+ //tstRslt.FlowMass = oriTestRslt.FlowMass;
+ //tstRslt.FlowVolume = oriTestRslt.FlowVolume;
tstRslt.VolumeCTV = oriTestRslt.VolumeCTV;
tstRslt.VolumeMaster = oriTestRslt.VolumeMaster;
tstRslt.ErrorMaster = oriTestRslt.ErrorMaster;
@@ -752,7 +795,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
meterRslt.VolumeStart = oriMeterRslt.VolumeStart;
meterRslt.VolumeEnd = oriMeterRslt.VolumeEnd;
#if ORACLE_DB
- if (ProcessData.BatchRslts.Batch.WaterMeters[i].Pruefindex == 1)
+ if ((ProcessData.BatchRslts.Batch.WaterMeters[i].Pruefindex % 100) == 1)
{
meterRslt.Passed = (oriMeterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin()
&& oriMeterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin());
@@ -855,8 +898,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
tstRslt.MassEndRaw = testRsltQ2ac.MassEndRaw;
tstRslt.MassEnd = testRsltQ2ac.MassEnd;
tstRslt.MassOfEvapWater = testRsltQ2ac.MassOfEvapWater;
- tstRslt.Qdetected = testRsltQ2ac.Qdetected;
- tstRslt.Flow = testRsltQ2ac.Flow;
+ //tstRslt.FlowMass = testRsltQ2ac.FlowMass;
+ //tstRslt.FlowVolume = testRsltQ2ac.FlowVolume;
tstRslt.VolumeCTV = testRsltQ2ac.VolumeCTV;
tstRslt.VolumeMaster = testRsltQ2ac.VolumeMaster;
tstRslt.ErrorMaster = testRsltQ2ac.ErrorMaster;
@@ -894,14 +937,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
meterRslt.TestDone = meterRsltQ2ac.TestDone;
tstRslt.TestDone = true;
- double targetError = 0;
- if ((sensPath != null) && (sensPath.RegisterReaders != null) && (sensPath.RegisterReaders.Length > i) && (sensPath.RegisterReaders[i] is iPerlHead.IperlHead))
- {
- targetError = (sensPath.RegisterReaders[i] as iPerlHead.IperlHead).CalibTargetQ2;
- }
-
- if ((((meterRsltQ2bc.Error - targetError) < -0.51) && (meterRsltQ2ac.Error < meterRsltQ2bc.Error)) ||
- (((meterRsltQ2bc.Error - targetError) > +0.51) && (meterRsltQ2ac.Error > meterRsltQ2bc.Error)))
+ if (((meterRsltQ2bc.Error < -0.51) && (meterRsltQ2ac.Error < meterRsltQ2bc.Error)) ||
+ ((meterRsltQ2bc.Error > +0.51) && (meterRsltQ2ac.Error > meterRsltQ2bc.Error)))
{
meterRslt.Passed = false; /// Q2 correction check failed
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs
index d47e86266..3997be4ae 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlDataWrite.cs
@@ -2,19 +2,22 @@
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
+using static Sensus.iPerl.NfcHandler.MCI_Protocol;
namespace TBF.Rig.TestMethods.iPerlCommunication
{
public class iPerlDataWrite
{
public MessageID MessageID;
+ public StructName StructName;
public int Offset;
public byte[] Data;
public string Description;
- public iPerlDataWrite(MessageID mesageID, int offset, byte[] data, string description)
+ public iPerlDataWrite(MessageID mesageID, StructName structName, int offset, byte[] data, string description)
{
MessageID = mesageID;
+ StructName = structName;
Offset = offset;
Data = data;
Description = description;
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs
index e13313ce2..12ac3a0c1 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlEnums.cs
@@ -17,7 +17,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
RL,
LR,
Standard_incl_05,
+ Standard_plus_incl_05,
Dewa_incl_05,
+ Dewa_plus_incl_05,
Greece_incl_05,
RL_incl_05,
LR_incl_05,
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs
index 0069eb96a..2c8b65102 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Enums.cs
@@ -104,4 +104,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
Flush = 0,
ProcessAndSave,
}
+
+ public enum CommunicationInterface
+ {
+ RFID,
+ NFC
+ }
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs
index c69ad1f4f..eb2bff000 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/Factory.cs
@@ -9,7 +9,6 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public class Factory : IComponentFactory
{
public string ClassName { get { return "RegisterReader for iPerl"; } }
- public override string ToString() { return ClassName; }
public IComponent DummyComponent() { return new IperlHead(); }
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs
index 63253822b..94cc8ea41 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs
@@ -2,25 +2,28 @@
/// Copyright (c) 2015-2022 Sensus Slovensko a.s.
///
using System;
-using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
-using System.Linq;
using log4net;
using Common;
using Common.Iperl;
using Config.Entities;
using TBF.Rig.Generic;
using TBF.Rig.GenericDevices;
-using TBF.Rig.Output;
-using TBF.Rig.Sequences;
+using Sensus.iPerl.NfcHandler;
+using NHibernate;
+using Renci.SshNet;
+using System.Linq;
+using System.Xml;
+using System.Xml.Linq; // This line is correct and does not need to be changed.
+using System.Windows;
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
///
/// This component = instance of this class is a placeholder for a combined main watermeter
///
- public class IperlHead : ComponentBase, IDevice, IRegReaderDatastream, ISessionDataMngmnt, IOperation
+ public class IperlHead : ComponentBase, IDevice,IRegReaderDatastream, ISessionDataMngmnt, IOperation
{
private static readonly ILog log = LogManager.GetLogger(typeof(IperlHead));
public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); }
@@ -40,9 +43,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
readonly IperlHeadCfg iperlHeadCfg;
public int RfidComPortNr { get { return iperlHeadCfg.RfidComPortNr; } }
+ public int OptoComPortNr { get { return iperlHeadCfg.OptoComPortNr; } }
public int MuxBoardNrOrGroup14 { get { return iperlHeadCfg.MuxBoardNr; } }
public int Group { get { return iperlHeadCfg.Group; } }
public iPerlHead.MeterType MeterType { get { return iperlHeadCfg.MeterType; } }
+ public CommunicationInterface CommInterface { get { return iperlHeadCfg.CommunicationInterface; } }
public int Position
{
@@ -58,11 +63,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } }
public double CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } }
- public double CalibTargetQ2 { get { return iperlHeadCfg.ProcParams.CalibTargetQ2; } }
public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } }
public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } }
public Counting InitFlowDir { get { return (iperlHeadCfg != null && iperlHeadCfg.ProcParams != null) ? iperlHeadCfg.ProcParams.Counting : Counting.Arbitrary; } }
- public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB
/// Properties set by the Begin and the End form
@@ -70,10 +73,17 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
get
{
- if (ConfigStruct != null) return ConfigStruct.GetPcbNrString();
- else return string.Empty;
+ if (ConfigStruct != null)
+ return ConfigStruct.GetPcbNrString();
+ else if (simulatedPcbNr != null)
+ return simulatedPcbNr;
+ else
+ return string.Empty;
+ }
+ set
+ {
+ simulatedPcbNr = value;
}
- set { }
}
public bool Disabled;
@@ -103,6 +113,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public CalibrationStruct CalibrationStruct; /// CalibrationStruct of WM obtained or updated by iPerlCommunication
public CalibrationStructV4 CalibrationStructV4; /// CalibrationStruct of WM obtained or updated by iPerlCommunication
+ public Byte OrigTestModeConfig; /// Written to by StartTestingSealedMeter(), read from by EndTestingSealedMeter()
+
public ushort OrigCalibFactor;
public ushort CalibFactor
{
@@ -152,6 +164,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public double WMVolume { get { return wmVolume; } }
public double WMTestTime { get { return wmTestTime; } }
+ string simulatedPcbNr = null;
+
int wmPulses;
int wmRefPulses;
double beginWMState;
@@ -213,11 +227,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
/// Nominal flow in m3/h
/// 0 or the current Q2 correction factor when updating the factor
/// Calculated Q2 correction factor
- public double CalculateQ2CorrectionFactor(Results.Entities.MeterTestRslt q2adjResult, double calibTarget, double nominalFlow, int currentFactor = 0)
+ public double CalculateQ2CorrectionFactor(Results.Entities.MeterTestRslt currentQ2Result, int currentFactor, double nominalFlow, double errorTarget = 0)
{
- double nominalTestFlowLph = Units.ConvertTo(Common.Unit.lph, nominalFlow);
- double volumeRefShiftedToTarget = q2adjResult.VolumeRef * (1.0 + calibTarget / 100.0);
- double q2adjErrorShiftedToTarget = Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, volumeRefShiftedToTarget);
+ double nominalTestFlowLph = Units.ConvertTo(Unit.lph, nominalFlow);
+ double volumeRefShiftedToTarget = currentQ2Result.VolumeRef * (1.0 + errorTarget / 100.0);
+ double q2adjErrorShiftedToTarget = Config.Formulas.ErrorFromVolumes(currentQ2Result.VolumeMeter, volumeRefShiftedToTarget);
double A = 16.0 / ScalingFactor(); /// Raw units per ml: DN15=16, DN20=8, DN25=4, DN32=2, DN40=1
const double B = 8.0; /// Raw units per minute, 8
@@ -226,14 +240,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
double F = D / (nominalTestFlowLph * 10.0); /// Error corrected with 8 Raw Units per minute [%]
double G = F / B; /// Error corrected with 1 Raw Unit per minute [%]
- double q2CorrectionFactor = Convert.ToDouble(currentFactor)
- - (q2adjErrorShiftedToTarget / G) * (volumeRefShiftedToTarget / q2adjResult.VolumeMeter);
+ /// Do not change the factor for an invalid measurement (q2adjResult.VolumeMeter == 0)
+ double q2CorrectionFactor = (Math.Abs(currentQ2Result.VolumeMeter) <= float.Epsilon) ? Convert.ToDouble(currentFactor) :
+ Convert.ToDouble(currentFactor) - (q2adjErrorShiftedToTarget / G) * (volumeRefShiftedToTarget / currentQ2Result.VolumeMeter);
- log.WarnFormat("CalculateQ2CorrectionFactor() : Pos={0}, PCB#={1}, Error={2}%, CalTarget={3}%, Q2CorrFactor={4}",
+ log.WarnFormat("CalculateQ2CorrectionFactor() : Pos={0}, PCB#={1}, Error={2}%, Target={3}%, Current factor={4} New factor={5}",
Name,
SerialNr,
- q2adjResult.Error.ToString("F2"),
- calibTarget.ToString("F1"),
+ currentQ2Result.Error.ToString("F2"),
+ errorTarget.ToString("F3"),
+ currentFactor.ToString("F1"),
q2CorrectionFactor.ToString("F1"));
return q2CorrectionFactor;
@@ -283,12 +299,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
///
/// Currently executed test
/// Currently executed repetition number
- public void TestIsGoingToStartSoon(Test test, int repetitionNr)
+ public void TestIsGoingToStartSoon(Test _test, int _repetitionNr)
{
/// Store/update values to be used as a part of the opto-data log file name
- testName = test.Name;
- testRepeats = test.Repeats;
- this.repetitionNr = repetitionNr;
+ this.test = _test;
+ this.repetitionNr = _repetitionNr;
if (IsDataStreamProcessing())
{
@@ -324,8 +339,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
}
}
///
- string testName;
- int testRepeats;
+ Test test;
int repetitionNr;
@@ -420,20 +434,26 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
synchronized = false;
synchronized2 = false;
partOfTelegram = string.Empty;
+ optoSerialPort = null;
if (DebugLevel == DebugMode.Normal)
{
/// Open serial port: 9600 Bd, 8 data bits, 1 stop bit, no parity
- string portName = string.Format("COM{0}", iperlHeadCfg.OptoComPortNr);
- optoSerialPort = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One);
- optoSerialPort.Handshake = Handshake.None;
- optoSerialPort.Open();
- log.FatalFormat("{0} initialized: {1}", Name, this);
+ /// Check whether head is connected, working
+ try
+ {
+ OpenOptoSerialPort($"COM{iperlHeadCfg.OptoComPortNr}", 9600, Parity.None, 8, StopBits.One, Handshake.None);
+ CloseOptoSerialPort();
+ log.FatalFormat($"{Name} initialized: {this}");
+ }
+ catch (Exception ex)
+ {
+ throw new Exception(ex.Message);
+ }
}
else
{
- optoSerialPort = null;
- log.FatalFormat("{0} simulated: {1}", Name, this);
+ log.FatalFormat($"{Name} simulated: {this}");
}
}
@@ -451,6 +471,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
CalibrationStruct = null;
CalibrationStructV4 = null;
+ OrigTestModeConfig = 0;
+
LastTestResult = null;
LastTestResult2 = null;
@@ -460,6 +482,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
Q2CorrRL = 0;
Q2CorrLR = 0;
+ simulatedPcbNr = null;
+
dataStreamState = DataStreamState.Flush;
currentFlowDir = InitFlowDir;
@@ -535,10 +559,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
try
{
- if (DebugLevel == DebugMode.Normal && optoSerialPort != null)
+ if (optoSerialPort != null)
{
- optoSerialPort.Close();
- optoSerialPort = null;
+ CloseOptoSerialPort();
}
}
catch
@@ -552,7 +575,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
/// Events: Event.ReadRegisterDone, Event.Error
///
/// ReadWaterMeter instance reference casted to IOperaton
- public IOperation ReadDatastreamOp()
+ public IOperation ReadRegisterOp()
{
return this;
}
@@ -656,20 +679,26 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
//
// log.DebugFormat("Feature vector calculation end, save opto-file start: {0:HH:mm:ss.fff}", DateTime.Now);
- string relativeDirectory = Path.Combine(StateMachine.CycleStartTimeStamp.ToString("yy"),
- StateMachine.CycleStartTimeStamp.ToString("MM"),
- StateMachine.CycleStartTimeStamp.ToString("dd"));
- string directory = Path.Combine(OptoDataDirectory, relativeDirectory);
- string fileName = DetermineExtraDataFileName();
- if (!string.IsNullOrEmpty(fileName))
+#if ORACLE_DB
+ if (test.RawDataId + (test.Repeats - repetitionNr) * test.RawDataIdRepetMulti != 0)
{
- if (SaveOptoDataToFile(directory, fileName))
+ string relativeDirectory = Path.Combine(StateMachine.CycleStartTimeStamp.ToString("yy"),
+ StateMachine.CycleStartTimeStamp.ToString("MM"),
+ StateMachine.CycleStartTimeStamp.ToString("dd"));
+ string fileName = DetermineExtraDataFileName();
+ if (SaveOptoDataToFile(Path.Combine(OptoDataDirectory, relativeDirectory), fileName))
{
extraDataPath = Path.Combine(relativeDirectory, fileName);
}
- }
- log.WarnFormat("IperlHeadd.Stop() startIx={0} endIx={1} optoData.Len={2} filename={3}", startIx, endIx, optoData.Length, !string.IsNullOrEmpty(fileName) ? fileName : "");
+ log.WarnFormat("IperlHead.Stop() startIx={0} endIx={1} len={2} raw data file = {3}",
+ startIx, endIx, optoData.Length, fileName);
+ }
+ else
+#endif
+ {
+ log.WarnFormat("IperlHead.Stop() startIx={0} endIx={1} len={2} no raw data file", startIx, endIx, optoData.Length);
+ }
if (TestStartTelegramIx == 0 || optoDataCount < 100)
{
@@ -736,36 +765,27 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
string DetermineExtraDataFileName()
{
///
- /// Select or create appropriate test infos
- ///
- Results.Output.SensusTestInfo[] testInfos = Sequences.ProcessData.CompleteTestInfos;
- ///
- if ((ProcessData.OracleDB != null && ProcessData.OracleDB.DesigMode == Output.DB.SensusOracle.DesigMode.Based_on_procedure) ||
- (testInfos == null && StateMachine.Procedure != null))
- {
- testInfos = Results.Output.SensusTestInfo.CreateFromProcedure(StateMachine.Procedure);
- }
-
- ///
- /// Select or create appropriate 'qBezeichnung'
- ///
- string fullTestName = Results.Utils.GetTestName(testName, testRepeats, repetitionNr);
- var ti = testInfos.FirstOrDefault(x => x.PruefungsNrOpto != 0 && x.TestName == fullTestName);
- string qBezeichnung = (ti == null) ? fullTestName /// No appropriate TestInfo found => set default opto data file name
- : string.IsNullOrEmpty(ti.QBezeichnungOpto) ? ti.PruefungsNrOpto.ToString("D2")
- : ti.QBezeichnungOpto;
- ///
- /// Get other required pieces of information
+ /// Get required pieces of information
///
string pcbNr = (ConfigStruct != null) ? ConfigStruct.GetPcbNrString() : "UnknownPcbNr";
string wmPosition = Name.Substring(5); /// WMPosition is extracted from a component name in form 'iPerl#'
if (wmPosition.Length == 1) wmPosition = "0" + wmPosition;
string cycleStartTime = StateMachine.CycleStartTimeStamp.ToString("HH_mm_ss");
-
+#if ORACLE_DB
+ string[] designations = string.IsNullOrEmpty(test.RawDataDesignation) ? new string[0] : test.RawDataDesignation.Split(new char[] { '~' });
+ int testId = test.RawDataId + (test.Repeats - repetitionNr) * test.RawDataIdRepetMulti;
+ string designation = string.IsNullOrEmpty(test.RawDataDesignation)
+ ? testId.ToString(testId > 0 ? "D2" : "D1") /// Name is generated from Id
+ : (designations.Length > repetitionNr - 1) ? designations[repetitionNr - 1] /// Name is from 'RawDataDesignation' parameter
+ : string.Format("{0}-{1}", designations[0], repetitionNr); /// Name is form test name and repetition nr.
+#else
+ int testId = 0;
+ string designation = (test.Repeats == 1) ? test.Name : string.Format("{0}-{1}", test.Name, repetitionNr);
+#endif
///
/// Return the file name
- ///
- return string.Format("{0}_{1}_{2}_{3}.txt", pcbNr, wmPosition, qBezeichnung, cycleStartTime);
+ ///
+ return string.Format("{0}_{1}_{2}_{3}.txt", pcbNr, wmPosition, designation, cycleStartTime);
}
@@ -775,7 +795,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
bool SaveOptoDataToFile(string directory, string fileName)
{
string fullFileName = Path.Combine(directory, fileName);
- log.WarnFormat("Saving {0} opto data to {1}", Name, fullFileName);
+ log.WarnFormat("Saving {0} raw data to {1}", Name, fullFileName);
try
{
@@ -840,6 +860,42 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
wmTestTime = timestampSec - timestampSec0;
}
+ private void OpenOptoSerialPort(string comPort, int baudRate, Parity parity, int dataBits, StopBits stopBit, Handshake handshake)
+ {
+ if (DebugLevel == DebugMode.FailureDuringOperation) DebugLevel = DebugMode.Normal;
+ if (DebugLevel == DebugMode.Normal)
+ {
+ /// Open serial port: 9600 Bd, 8 data bits, 1 stop bit, no parity
+ try
+ {
+ CloseOptoSerialPort();
+ optoSerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBit);
+ optoSerialPort.Handshake = handshake;
+ optoSerialPort.Open();
+ log.FatalFormat($"{Name} OptoPort opened: {this}");
+ }
+ catch (Exception ex)
+ {
+ log.FatalFormat($"{Name} OptoPort - error opening port: {this}" + Environment.NewLine + ex.Message);
+ throw ex;
+ }
+ }
+ else
+ {
+ optoSerialPort = null;
+ log.FatalFormat($"{Name} OproPort simulated: {this}");
+ }
+ }
+
+ private void CloseOptoSerialPort()
+ {
+ if (optoSerialPort != null)
+ {
+ optoSerialPort.Close();
+ optoSerialPort = null;
+ log.FatalFormat($"{Name} OptoPort closed: {this}");
+ }
+ }
DataStreamState dataStreamState;
@@ -848,6 +904,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
///
public void StartDataStreamProcessing()
{
+ try
+ {
+ OpenOptoSerialPort($"COM{iperlHeadCfg.OptoComPortNr}", 9600, Parity.None, 8, StopBits.One, Handshake.None);
+ }
+ catch (Exception)
+ {
+ }
/// Reset opto-data, etc.
optoDataCount = 0;
timeFromStart = 0;
@@ -878,20 +941,21 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
///
/// Stop processing and saving datastream data
///
- void StopDataStreamProcessing()
+ public void StopDataStreamProcessing()
{
dataStreamState = DataStreamState.Flush;
+ CloseOptoSerialPort();
}
- ///
- /// Variables storing the context of serial port data parsing (ReadOptoSerialPort(...))
- ///
- bool synchronized;
+ ///
+ /// Variables storing the context of serial port data parsing (ReadOptoSerialPort(...))
+ ///
+ bool synchronized;
bool synchronized2;
string partOfTelegram;
///
- /// Reads opto-datastream via serual port. Invoked from RunDeviceBefore()
+ /// Reads opto-datastream via serial port. Invoked from RunDeviceBefore()
///
/// Telegram description:
/// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes)
@@ -903,6 +967,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
/// OptoState.Read or OptoState.Flush
void ReadOptoData(DataStreamState optoState)
{
+ if (optoSerialPort is null) return;
lock (this)
{
int nrBytes = optoSerialPort.BytesToRead;
@@ -949,7 +1014,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
/// CR+LF was found && (pos >= OptoTelegramRaw.Length - 2) && the telegram is OK
flowDirectionDetection.WriteToFifo(volumeRawExtLast, timestampExtLast);
- OptoTelegramRreceived(optoDataCount, synchronized2, volumeRawExtLast, timestampExtLast);
+ OptoTelegramReceived(optoDataCount, synchronized2, volumeRawExtLast, timestampExtLast);
synchronized2 = synchronized;
allRcvd = allRcvd.Substring(pos + 2);
}
@@ -998,8 +1063,25 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
}
}
+ public string ReadOptoData()
+ {
+ if (optoSerialPort is null) return "";
+ string received = ".";
+ lock (this)
+ {
+ int nrBytes = optoSerialPort.BytesToRead;
+ if (nrBytes > 0)
+ {
+ char[] buffer = new char[nrBytes];
+ optoSerialPort.Read(buffer, 0, nrBytes);
+ received = new string(buffer);
+ }
+ }
+ return received;
+ }
- void OptoTelegramRreceived(int currentIx, bool async, Int64 volumeRawExt, Int64 timestampRawExt)
+
+ void OptoTelegramReceived(int currentIx, bool async, Int64 volumeRawExt, Int64 timestampRawExt)
{
currentTelegramIx = currentIx;
@@ -1029,6 +1111,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
///
+ ///
/// Called from the state machine when a test is selected and UI needs to be updated.
///
public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
@@ -1326,5 +1409,72 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
if (reader.ReadBoolean()) (LastTestResult = new Results.Entities.MeterTestRslt()).ReadBinary(reader, null);
if (reader.ReadBoolean()) (LastTestResult2 = new Results.Entities.MeterTestRslt()).ReadBinary(reader, null);
}
+
+ internal void ResetNfcInterface(bool? nfc_on = null)
+ {
+ if (iperlHeadCfg.HeadCommunicationComPortNr == 0) return;
+
+ SERIAL_Driver _SERIAL_Driver_Head_Config = new SERIAL_Driver();
+ _SERIAL_Driver_Head_Config.OpenConnection($"COM{iperlHeadCfg.HeadCommunicationComPortNr}", 9600, 8, Parity.None, StopBits.One);
+
+ NFCHeadConfig _NFCHead_Config = new NFCHeadConfig(_SERIAL_Driver_Head_Config);
+ if (nfc_on == null || nfc_on == false) _NFCHead_Config.NFCHeadConfig_SetInterface(false); // set RFID interface
+ if (nfc_on == null || nfc_on == true ) _NFCHead_Config.NFCHeadConfig_SetInterface(true); // set NFC interface
+ _SERIAL_Driver_Head_Config.Close();
+ _SERIAL_Driver_Head_Config.Dispose();
+ }
+
+ internal void SetNfcInterface()
+ {
+ ResetNfcInterface(true);
+ }
+
+ internal void SetRfidInterface()
+ {
+ ResetNfcInterface(false);
+ }
+
+ internal void SetCommunicationInterface(CommunicationInterface commInterface)
+ {
+ //using (ISession session = TBF.DB.ConfigDBSessionFactory.OpenSession())
+ // Replace the problematic line with the following code to fix the error:
+ using (ISession session = TBF.DB.SessionFactories[(int)DBKind.Config].OpenSession())
+ using (ITransaction tx = session.BeginTransaction())
+ {
+ try
+ {
+ var cmpntEntities = session.QueryOver()
+ .OrderBy(x => x.ItemNr).Asc
+ .List();
+ var cmpnt = cmpntEntities.Where(x => x.Name == Name).First();
+ if (cmpnt != null)
+ {
+ XDocument doc = XDocument.Parse(cmpnt.Parameters);
+ if (doc != null)
+ {
+ XElement element = doc.Root.Element("CommunicationInterface");
+ if (element != null)
+ {
+ element.Value = commInterface.ToString();
+ cmpnt.Parameters = doc.ToString();
+ session.SaveOrUpdate(cmpnt);
+ tx.Commit();
+ log.FatalFormat($"Set CommunicationInterface {Name} to {commInterface.ToString()}");
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (tx != null) tx.Rollback();
+ log.FatalFormat($"Set CommunicationInterface {Name} error: {ex.Message}");
+ }
+ }
+ }
+
+ public IOperation ReadDatastreamOp()
+ {
+ return this;
+ }
}
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs
index eff628942..1cea9fee0 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs
@@ -21,10 +21,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public bool UseTcpIP;
public string OptoIPAddress;
public ushort OptoTcpipPortNr;
+ public int HeadCommunicationComPortNr;
public int OptoComPortNr;
public int RfidComPortNr; /// 0 = use MuxBoardNr
public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4
public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10
+ public CommunicationInterface CommunicationInterface; /// Communication Interface: RFID or NFC
/// Procedure parameters
[XmlIgnore]
@@ -45,6 +47,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
RfidComPortNr = 0; /// = use mux. board
MuxBoardNr = 1;
ProcParams = CreateProcParamsProvider() as ProcParams;
+ CommunicationInterface = CommunicationInterface.RFID;
+ HeadCommunicationComPortNr = 0;
}
public IperlHeadCfg(IComponentFactory factory)
@@ -55,12 +59,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public string ToString(int i)
{
- return string.Format("{0} Group1 (mux#)={1}, Group2={2}, Opto=Com{3}, RFID=Com{4}",
- Name,
- MuxBoardNr,
- Group,
- OptoComPortNr,
- RfidComPortNr);
+ return $"{Name} Group1 (mux#)={MuxBoardNr}, Group2={Group}, Opto=Com{OptoComPortNr}, {CommunicationInterface}=Com{RfidComPortNr}";
}
}
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs
index 6616b5b18..20992b2a6 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs
@@ -3,16 +3,14 @@
///
using System;
using System.Net;
-using System.Net.Sockets;
using System.Windows.Forms;
using Common;
-using Config.Entities;
using TBF.Rig.Generic;
using TBF.Resources;
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
- public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl
+ public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl
{
public bool ShowMore { get { return false; } }
@@ -51,11 +49,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
radioButton2.Checked = !config.UseTcpIP;
ipAddressTextBox.Text = (config.OptoIPAddress != null) ? config.OptoIPAddress : "0.0.0.0";
tcpipPortTextBox.Text = config.OptoTcpipPortNr.ToString();
+ headPortNrTextBox.Text = config.HeadCommunicationComPortNr.ToString();
optoSerialPortTextBox.Text = config.OptoComPortNr.ToString();
rfidPortNrTextBox.Text = config.RfidComPortNr.ToString();
muxBoardNrTextBox.Text = config.MuxBoardNr.ToString();
groupTextBox.Text = config.Group.ToString();
- }
+ comboBoxCommunicationInterface.SelectedItem = config.CommunicationInterface.ToString();
+ tabPage2.Controls.Add(new IperlHeadTestCtrl(config));
+ }
public void Unlock()
{
@@ -66,8 +67,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
tcpipPortTextBox.Enabled = true;
optoSerialPortTextBox.Enabled = true;
rfidPortNrTextBox.Enabled = true;
+ headPortNrTextBox.Enabled = true;
muxBoardNrTextBox.Enabled = true;
groupTextBox.Enabled = true;
+ comboBoxCommunicationInterface.Enabled = true;
}
public CfgUpdateFlags VerifyCfg(ref string message)
@@ -106,6 +109,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
message += Environment.NewLine + "'RFID serial port nr.' is not valid";
}
+ if (!int.TryParse(headPortNrTextBox.Text, out dummy) || dummy < 0 || dummy > 999)
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "'Head communication serial port nr.' is not valid";
+ }
+
if (!int.TryParse(muxBoardNrTextBox.Text, out dummy) || dummy < 1 || dummy > 4)
{
flags |= CfgUpdateFlags.Error;
@@ -144,8 +153,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
config.RfidComPortNr = int.Parse(rfidPortNrTextBox.Text);
config.MuxBoardNr = int.Parse(muxBoardNrTextBox.Text);
config.Group = int.Parse(groupTextBox.Text);
+ config.CommunicationInterface = (CommunicationInterface)comboBoxCommunicationInterface.SelectedIndex;
+ config.HeadCommunicationComPortNr = int.Parse(headPortNrTextBox.Text);
return flags;
}
- }
+ }
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs
index bc657169d..7c8ab0de8 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs
@@ -31,149 +31,150 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
///
private void InitializeComponent()
{
- this.nameTextBox = new System.Windows.Forms.TextBox();
- this.nameLabel = new System.Windows.Forms.Label();
- this.classNameLabel = new System.Windows.Forms.Label();
- this.optoSerialPortTextBox = new System.Windows.Forms.TextBox();
- this.optoSerialPortLabel = new System.Windows.Forms.Label();
- this.muxBoardNrTextBox = new System.Windows.Forms.TextBox();
- this.muxBoardNrLabel = new System.Windows.Forms.Label();
- this.groupTextBox = new System.Windows.Forms.TextBox();
- this.groupLabel = new System.Windows.Forms.Label();
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.comboBoxCommunicationInterface = new System.Windows.Forms.ComboBox();
+ this.label1 = new System.Windows.Forms.Label();
this.rfidPortNrTextBox = new System.Windows.Forms.TextBox();
this.rfidSerialPortNrLabel = new System.Windows.Forms.Label();
- this.radioButton1 = new System.Windows.Forms.RadioButton();
- this.radioButton2 = new System.Windows.Forms.RadioButton();
this.optoDataGroupBox = new System.Windows.Forms.GroupBox();
this.tcpipPortLabel = new System.Windows.Forms.Label();
this.tcpipPortTextBox = new System.Windows.Forms.TextBox();
this.ipAddressLabel = new System.Windows.Forms.Label();
this.ipAddressTextBox = new System.Windows.Forms.TextBox();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.label3 = new System.Windows.Forms.Label();
- this.label4 = new System.Windows.Forms.Label();
- this.optoDataGroupBox.SuspendLayout();
+ this.radioButton1 = new System.Windows.Forms.RadioButton();
+ this.radioButton2 = new System.Windows.Forms.RadioButton();
+ this.optoSerialPortLabel = new System.Windows.Forms.Label();
+ this.optoSerialPortTextBox = new System.Windows.Forms.TextBox();
+ this.groupTextBox = new System.Windows.Forms.TextBox();
+ this.groupLabel = new System.Windows.Forms.Label();
+ this.muxBoardNrTextBox = new System.Windows.Forms.TextBox();
+ this.muxBoardNrLabel = new System.Windows.Forms.Label();
+ this.nameTextBox = new System.Windows.Forms.TextBox();
+ this.nameLabel = new System.Windows.Forms.Label();
+ this.classNameLabel = new System.Windows.Forms.Label();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.headPortNrTextBox = new System.Windows.Forms.TextBox();
+ this.tabControl1.SuspendLayout();
+ this.tabPage1.SuspendLayout();
this.groupBox1.SuspendLayout();
+ this.optoDataGroupBox.SuspendLayout();
+ this.groupBox2.SuspendLayout();
this.SuspendLayout();
//
- // nameTextBox
+ // tabControl1
//
- this.nameTextBox.Enabled = false;
- this.nameTextBox.Location = new System.Drawing.Point(135, 40);
- this.nameTextBox.Name = "nameTextBox";
- this.nameTextBox.Size = new System.Drawing.Size(121, 20);
- this.nameTextBox.TabIndex = 2;
+ this.tabControl1.Controls.Add(this.tabPage1);
+ this.tabControl1.Controls.Add(this.tabPage2);
+ this.tabControl1.Location = new System.Drawing.Point(3, 3);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(611, 432);
+ this.tabControl1.TabIndex = 0;
//
- // nameLabel
+ // tabPage1
//
- this.nameLabel.AutoSize = true;
- this.nameLabel.Location = new System.Drawing.Point(25, 43);
- this.nameLabel.Name = "nameLabel";
- this.nameLabel.Size = new System.Drawing.Size(35, 13);
- this.nameLabel.TabIndex = 1;
- this.nameLabel.Text = "Name";
+ this.tabPage1.Controls.Add(this.groupBox2);
+ this.tabPage1.Controls.Add(this.label4);
+ this.tabPage1.Controls.Add(this.label3);
+ this.tabPage1.Controls.Add(this.groupBox1);
+ this.tabPage1.Controls.Add(this.optoDataGroupBox);
+ this.tabPage1.Controls.Add(this.groupTextBox);
+ this.tabPage1.Controls.Add(this.groupLabel);
+ this.tabPage1.Controls.Add(this.muxBoardNrTextBox);
+ this.tabPage1.Controls.Add(this.muxBoardNrLabel);
+ this.tabPage1.Controls.Add(this.nameTextBox);
+ this.tabPage1.Controls.Add(this.nameLabel);
+ this.tabPage1.Controls.Add(this.classNameLabel);
+ this.tabPage1.Location = new System.Drawing.Point(4, 25);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage1.Size = new System.Drawing.Size(603, 403);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "Config";
+ this.tabPage1.UseVisualStyleBackColor = true;
//
- // classNameLabel
+ // label4
//
- this.classNameLabel.AutoSize = true;
- this.classNameLabel.Location = new System.Drawing.Point(132, 16);
- this.classNameLabel.Name = "classNameLabel";
- this.classNameLabel.Size = new System.Drawing.Size(60, 13);
- this.classNameLabel.TabIndex = 0;
- this.classNameLabel.Text = "ClassName";
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(208, 101);
+ this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(40, 16);
+ this.label4.TabIndex = 25;
+ this.label4.Text = "1 .. 10";
//
- // optoSerialPortTextBox
+ // label3
//
- this.optoSerialPortTextBox.Enabled = false;
- this.optoSerialPortTextBox.Location = new System.Drawing.Point(329, 42);
- this.optoSerialPortTextBox.Name = "optoSerialPortTextBox";
- this.optoSerialPortTextBox.Size = new System.Drawing.Size(34, 20);
- this.optoSerialPortTextBox.TabIndex = 7;
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(208, 72);
+ this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(33, 16);
+ this.label3.TabIndex = 24;
+ this.label3.Text = "1 .. 4";
//
- // optoSerialPortLabel
+ // groupBox1
//
- this.optoSerialPortLabel.AutoSize = true;
- this.optoSerialPortLabel.Location = new System.Drawing.Point(241, 45);
- this.optoSerialPortLabel.Name = "optoSerialPortLabel";
- this.optoSerialPortLabel.Size = new System.Drawing.Size(72, 13);
- this.optoSerialPortLabel.TabIndex = 6;
- this.optoSerialPortLabel.Text = "Serial port nr.:";
+ this.groupBox1.Controls.Add(this.comboBoxCommunicationInterface);
+ this.groupBox1.Controls.Add(this.label1);
+ this.groupBox1.Controls.Add(this.rfidPortNrTextBox);
+ this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel);
+ this.groupBox1.Location = new System.Drawing.Point(10, 259);
+ this.groupBox1.Margin = new System.Windows.Forms.Padding(4);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Padding = new System.Windows.Forms.Padding(4);
+ this.groupBox1.Size = new System.Drawing.Size(552, 68);
+ this.groupBox1.TabIndex = 23;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "RFID / NFC communication (in case mux. board is not used)";
//
- // muxBoardNrTextBox
+ // comboBoxCommunicationInterface
//
- this.muxBoardNrTextBox.Enabled = false;
- this.muxBoardNrTextBox.Location = new System.Drawing.Point(135, 63);
- this.muxBoardNrTextBox.Name = "muxBoardNrTextBox";
- this.muxBoardNrTextBox.Size = new System.Drawing.Size(34, 20);
- this.muxBoardNrTextBox.TabIndex = 9;
+ this.comboBoxCommunicationInterface.Enabled = false;
+ this.comboBoxCommunicationInterface.FormattingEnabled = true;
+ this.comboBoxCommunicationInterface.Items.AddRange(new object[] {
+ "RFID",
+ "NFC"});
+ this.comboBoxCommunicationInterface.Location = new System.Drawing.Point(201, 27);
+ this.comboBoxCommunicationInterface.Name = "comboBoxCommunicationInterface";
+ this.comboBoxCommunicationInterface.Size = new System.Drawing.Size(71, 24);
+ this.comboBoxCommunicationInterface.TabIndex = 9;
//
- // muxBoardNrLabel
+ // label1
//
- this.muxBoardNrLabel.AutoSize = true;
- this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66);
- this.muxBoardNrLabel.Name = "muxBoardNrLabel";
- this.muxBoardNrLabel.Size = new System.Drawing.Size(106, 13);
- this.muxBoardNrLabel.TabIndex = 8;
- this.muxBoardNrLabel.Text = "Group 1 (mux. board)";
- //
- // groupTextBox
- //
- this.groupTextBox.Enabled = false;
- this.groupTextBox.Location = new System.Drawing.Point(135, 86);
- this.groupTextBox.Name = "groupTextBox";
- this.groupTextBox.Size = new System.Drawing.Size(34, 20);
- this.groupTextBox.TabIndex = 11;
- //
- // groupLabel
- //
- this.groupLabel.AutoSize = true;
- this.groupLabel.Location = new System.Drawing.Point(25, 89);
- this.groupLabel.Name = "groupLabel";
- this.groupLabel.Size = new System.Drawing.Size(45, 13);
- this.groupLabel.TabIndex = 10;
- this.groupLabel.Text = "Group 2";
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(41, 30);
+ this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(153, 16);
+ this.label1.TabIndex = 8;
+ this.label1.Text = "Communication Interface";
//
// rfidPortNrTextBox
//
this.rfidPortNrTextBox.Enabled = false;
- this.rfidPortNrTextBox.Location = new System.Drawing.Point(329, 21);
+ this.rfidPortNrTextBox.Location = new System.Drawing.Point(439, 26);
+ this.rfidPortNrTextBox.Margin = new System.Windows.Forms.Padding(4);
this.rfidPortNrTextBox.Name = "rfidPortNrTextBox";
- this.rfidPortNrTextBox.Size = new System.Drawing.Size(34, 20);
+ this.rfidPortNrTextBox.Size = new System.Drawing.Size(44, 22);
this.rfidPortNrTextBox.TabIndex = 7;
//
// rfidSerialPortNrLabel
//
this.rfidSerialPortNrLabel.AutoSize = true;
- this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(241, 24);
+ this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(321, 30);
+ this.rfidSerialPortNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.rfidSerialPortNrLabel.Name = "rfidSerialPortNrLabel";
- this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(72, 13);
+ this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(88, 16);
this.rfidSerialPortNrLabel.TabIndex = 6;
this.rfidSerialPortNrLabel.Text = "Serial port nr.:";
//
- // radioButton1
- //
- this.radioButton1.AutoSize = true;
- this.radioButton1.Enabled = false;
- this.radioButton1.Location = new System.Drawing.Point(22, 19);
- this.radioButton1.Name = "radioButton1";
- this.radioButton1.Size = new System.Drawing.Size(83, 17);
- this.radioButton1.TabIndex = 0;
- this.radioButton1.TabStop = true;
- this.radioButton1.Text = "Use TCP/IP";
- this.radioButton1.UseVisualStyleBackColor = true;
- //
- // radioButton2
- //
- this.radioButton2.AutoSize = true;
- this.radioButton2.Enabled = false;
- this.radioButton2.Location = new System.Drawing.Point(234, 19);
- this.radioButton2.Name = "radioButton2";
- this.radioButton2.Size = new System.Drawing.Size(92, 17);
- this.radioButton2.TabIndex = 1;
- this.radioButton2.TabStop = true;
- this.radioButton2.Text = "Use serial port";
- this.radioButton2.UseVisualStyleBackColor = true;
- //
// optoDataGroupBox
//
this.optoDataGroupBox.Controls.Add(this.tcpipPortLabel);
@@ -184,125 +185,257 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
this.optoDataGroupBox.Controls.Add(this.radioButton2);
this.optoDataGroupBox.Controls.Add(this.optoSerialPortLabel);
this.optoDataGroupBox.Controls.Add(this.optoSerialPortTextBox);
- this.optoDataGroupBox.Location = new System.Drawing.Point(28, 114);
+ this.optoDataGroupBox.Location = new System.Drawing.Point(10, 131);
+ this.optoDataGroupBox.Margin = new System.Windows.Forms.Padding(4);
this.optoDataGroupBox.Name = "optoDataGroupBox";
- this.optoDataGroupBox.Size = new System.Drawing.Size(414, 97);
- this.optoDataGroupBox.TabIndex = 5;
+ this.optoDataGroupBox.Padding = new System.Windows.Forms.Padding(4);
+ this.optoDataGroupBox.Size = new System.Drawing.Size(552, 119);
+ this.optoDataGroupBox.TabIndex = 18;
this.optoDataGroupBox.TabStop = false;
this.optoDataGroupBox.Text = "Opto-data";
//
// tcpipPortLabel
//
this.tcpipPortLabel.AutoSize = true;
- this.tcpipPortLabel.Location = new System.Drawing.Point(31, 71);
+ this.tcpipPortLabel.Location = new System.Drawing.Point(41, 87);
+ this.tcpipPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.tcpipPortLabel.Name = "tcpipPortLabel";
- this.tcpipPortLabel.Size = new System.Drawing.Size(47, 13);
+ this.tcpipPortLabel.Size = new System.Drawing.Size(54, 16);
this.tcpipPortLabel.TabIndex = 4;
this.tcpipPortLabel.Text = "Port nr..:";
//
// tcpipPortTextBox
//
this.tcpipPortTextBox.Enabled = false;
- this.tcpipPortTextBox.Location = new System.Drawing.Point(107, 68);
+ this.tcpipPortTextBox.Location = new System.Drawing.Point(143, 84);
+ this.tcpipPortTextBox.Margin = new System.Windows.Forms.Padding(4);
this.tcpipPortTextBox.Name = "tcpipPortTextBox";
- this.tcpipPortTextBox.Size = new System.Drawing.Size(39, 20);
+ this.tcpipPortTextBox.Size = new System.Drawing.Size(51, 22);
this.tcpipPortTextBox.TabIndex = 5;
//
// ipAddressLabel
//
this.ipAddressLabel.AutoSize = true;
- this.ipAddressLabel.Location = new System.Drawing.Point(31, 48);
+ this.ipAddressLabel.Location = new System.Drawing.Point(41, 59);
+ this.ipAddressLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.ipAddressLabel.Name = "ipAddressLabel";
- this.ipAddressLabel.Size = new System.Drawing.Size(63, 13);
+ this.ipAddressLabel.Size = new System.Drawing.Size(78, 16);
this.ipAddressLabel.TabIndex = 2;
this.ipAddressLabel.Text = "IP address.:";
//
// ipAddressTextBox
//
this.ipAddressTextBox.Enabled = false;
- this.ipAddressTextBox.Location = new System.Drawing.Point(107, 45);
+ this.ipAddressTextBox.Location = new System.Drawing.Point(143, 55);
+ this.ipAddressTextBox.Margin = new System.Windows.Forms.Padding(4);
this.ipAddressTextBox.Name = "ipAddressTextBox";
- this.ipAddressTextBox.Size = new System.Drawing.Size(98, 20);
+ this.ipAddressTextBox.Size = new System.Drawing.Size(129, 22);
this.ipAddressTextBox.TabIndex = 3;
//
- // groupBox1
+ // radioButton1
//
- this.groupBox1.Controls.Add(this.rfidPortNrTextBox);
- this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel);
- this.groupBox1.Location = new System.Drawing.Point(28, 218);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(414, 55);
- this.groupBox1.TabIndex = 12;
- this.groupBox1.TabStop = false;
- this.groupBox1.Text = "RFID communication (in case mux. board is not used)";
+ this.radioButton1.AutoSize = true;
+ this.radioButton1.Checked = true;
+ this.radioButton1.Enabled = false;
+ this.radioButton1.Location = new System.Drawing.Point(29, 23);
+ this.radioButton1.Margin = new System.Windows.Forms.Padding(4);
+ this.radioButton1.Name = "radioButton1";
+ this.radioButton1.Size = new System.Drawing.Size(99, 20);
+ this.radioButton1.TabIndex = 0;
+ this.radioButton1.TabStop = true;
+ this.radioButton1.Text = "Use TCP/IP";
+ this.radioButton1.UseVisualStyleBackColor = true;
//
- // label3
+ // radioButton2
//
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(176, 66);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(31, 13);
- this.label3.TabIndex = 13;
- this.label3.Text = "1 .. 4";
+ this.radioButton2.AutoSize = true;
+ this.radioButton2.Enabled = false;
+ this.radioButton2.Location = new System.Drawing.Point(312, 23);
+ this.radioButton2.Margin = new System.Windows.Forms.Padding(4);
+ this.radioButton2.Name = "radioButton2";
+ this.radioButton2.Size = new System.Drawing.Size(115, 20);
+ this.radioButton2.TabIndex = 1;
+ this.radioButton2.Text = "Use serial port";
+ this.radioButton2.UseVisualStyleBackColor = true;
//
- // label4
+ // optoSerialPortLabel
//
- this.label4.AutoSize = true;
- this.label4.Location = new System.Drawing.Point(176, 89);
- this.label4.Name = "label4";
- this.label4.Size = new System.Drawing.Size(37, 13);
- this.label4.TabIndex = 14;
- this.label4.Text = "1 .. 10";
+ this.optoSerialPortLabel.AutoSize = true;
+ this.optoSerialPortLabel.Location = new System.Drawing.Point(321, 55);
+ this.optoSerialPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.optoSerialPortLabel.Name = "optoSerialPortLabel";
+ this.optoSerialPortLabel.Size = new System.Drawing.Size(88, 16);
+ this.optoSerialPortLabel.TabIndex = 6;
+ this.optoSerialPortLabel.Text = "Serial port nr.:";
//
- // WaterMeterCfgCtrl
+ // optoSerialPortTextBox
//
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.optoSerialPortTextBox.Enabled = false;
+ this.optoSerialPortTextBox.Location = new System.Drawing.Point(439, 52);
+ this.optoSerialPortTextBox.Margin = new System.Windows.Forms.Padding(4);
+ this.optoSerialPortTextBox.Name = "optoSerialPortTextBox";
+ this.optoSerialPortTextBox.Size = new System.Drawing.Size(44, 22);
+ this.optoSerialPortTextBox.TabIndex = 7;
+ //
+ // groupTextBox
+ //
+ this.groupTextBox.Enabled = false;
+ this.groupTextBox.Location = new System.Drawing.Point(153, 97);
+ this.groupTextBox.Margin = new System.Windows.Forms.Padding(4);
+ this.groupTextBox.Name = "groupTextBox";
+ this.groupTextBox.Size = new System.Drawing.Size(44, 22);
+ this.groupTextBox.TabIndex = 22;
+ //
+ // groupLabel
+ //
+ this.groupLabel.AutoSize = true;
+ this.groupLabel.Location = new System.Drawing.Point(6, 101);
+ this.groupLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.groupLabel.Name = "groupLabel";
+ this.groupLabel.Size = new System.Drawing.Size(54, 16);
+ this.groupLabel.TabIndex = 21;
+ this.groupLabel.Text = "Group 2";
+ //
+ // muxBoardNrTextBox
+ //
+ this.muxBoardNrTextBox.Enabled = false;
+ this.muxBoardNrTextBox.Location = new System.Drawing.Point(153, 69);
+ this.muxBoardNrTextBox.Margin = new System.Windows.Forms.Padding(4);
+ this.muxBoardNrTextBox.Name = "muxBoardNrTextBox";
+ this.muxBoardNrTextBox.Size = new System.Drawing.Size(44, 22);
+ this.muxBoardNrTextBox.TabIndex = 20;
+ //
+ // muxBoardNrLabel
+ //
+ this.muxBoardNrLabel.AutoSize = true;
+ this.muxBoardNrLabel.Location = new System.Drawing.Point(6, 72);
+ this.muxBoardNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.muxBoardNrLabel.Name = "muxBoardNrLabel";
+ this.muxBoardNrLabel.Size = new System.Drawing.Size(131, 16);
+ this.muxBoardNrLabel.TabIndex = 19;
+ this.muxBoardNrLabel.Text = "Group 1 (mux. board)";
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Enabled = false;
+ this.nameTextBox.Location = new System.Drawing.Point(153, 40);
+ this.nameTextBox.Margin = new System.Windows.Forms.Padding(4);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.Size = new System.Drawing.Size(160, 22);
+ this.nameTextBox.TabIndex = 17;
+ //
+ // nameLabel
+ //
+ this.nameLabel.AutoSize = true;
+ this.nameLabel.Location = new System.Drawing.Point(6, 44);
+ this.nameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Size = new System.Drawing.Size(44, 16);
+ this.nameLabel.TabIndex = 16;
+ this.nameLabel.Text = "Name";
+ //
+ // classNameLabel
+ //
+ this.classNameLabel.AutoSize = true;
+ this.classNameLabel.Location = new System.Drawing.Point(149, 11);
+ this.classNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.classNameLabel.Name = "classNameLabel";
+ this.classNameLabel.Size = new System.Drawing.Size(78, 16);
+ this.classNameLabel.TabIndex = 15;
+ this.classNameLabel.Text = "ClassName";
+ //
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 25);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage2.Size = new System.Drawing.Size(603, 403);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "Test";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.headPortNrTextBox);
+ this.groupBox2.Controls.Add(this.label2);
+ this.groupBox2.Location = new System.Drawing.Point(10, 335);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(552, 50);
+ this.groupBox2.TabIndex = 26;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Head Communication";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(321, 18);
+ this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(88, 16);
+ this.label2.TabIndex = 7;
+ this.label2.Text = "Serial port nr.:";
+ //
+ // headPortNrTextBox
+ //
+ this.headPortNrTextBox.Enabled = false;
+ this.headPortNrTextBox.Location = new System.Drawing.Point(439, 15);
+ this.headPortNrTextBox.Margin = new System.Windows.Forms.Padding(4);
+ this.headPortNrTextBox.Name = "headPortNrTextBox";
+ this.headPortNrTextBox.Size = new System.Drawing.Size(44, 22);
+ this.headPortNrTextBox.TabIndex = 8;
+ //
+ // IperlHeadCfgCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.label4);
- this.Controls.Add(this.label3);
- this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.optoDataGroupBox);
- this.Controls.Add(this.groupTextBox);
- this.Controls.Add(this.groupLabel);
- this.Controls.Add(this.muxBoardNrTextBox);
- this.Controls.Add(this.muxBoardNrLabel);
- this.Controls.Add(this.nameTextBox);
- this.Controls.Add(this.nameLabel);
- this.Controls.Add(this.classNameLabel);
- this.Name = "WaterMeterCfgCtrl";
- this.Size = new System.Drawing.Size(500, 300);
+ this.Controls.Add(this.tabControl1);
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "IperlHeadCfgCtrl";
+ this.Size = new System.Drawing.Size(617, 438);
this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load);
- this.optoDataGroupBox.ResumeLayout(false);
- this.optoDataGroupBox.PerformLayout();
+ this.tabControl1.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ this.tabPage1.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
+ this.optoDataGroupBox.ResumeLayout(false);
+ this.optoDataGroupBox.PerformLayout();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
this.ResumeLayout(false);
- this.PerformLayout();
}
- #endregion
+ #endregion
- private System.Windows.Forms.TextBox nameTextBox;
- private System.Windows.Forms.Label nameLabel;
- private System.Windows.Forms.Label classNameLabel;
- private System.Windows.Forms.TextBox optoSerialPortTextBox;
- private System.Windows.Forms.Label optoSerialPortLabel;
- private System.Windows.Forms.TextBox muxBoardNrTextBox;
- private System.Windows.Forms.Label muxBoardNrLabel;
- private System.Windows.Forms.TextBox groupTextBox;
- private System.Windows.Forms.Label groupLabel;
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.ComboBox comboBoxCommunicationInterface;
+ private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox rfidPortNrTextBox;
private System.Windows.Forms.Label rfidSerialPortNrLabel;
- private System.Windows.Forms.RadioButton radioButton1;
- private System.Windows.Forms.RadioButton radioButton2;
private System.Windows.Forms.GroupBox optoDataGroupBox;
private System.Windows.Forms.Label tcpipPortLabel;
private System.Windows.Forms.TextBox tcpipPortTextBox;
private System.Windows.Forms.Label ipAddressLabel;
private System.Windows.Forms.TextBox ipAddressTextBox;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.Label label4;
- }
+ private System.Windows.Forms.RadioButton radioButton1;
+ private System.Windows.Forms.RadioButton radioButton2;
+ private System.Windows.Forms.Label optoSerialPortLabel;
+ private System.Windows.Forms.TextBox optoSerialPortTextBox;
+ private System.Windows.Forms.TextBox groupTextBox;
+ private System.Windows.Forms.Label groupLabel;
+ private System.Windows.Forms.TextBox muxBoardNrTextBox;
+ private System.Windows.Forms.Label muxBoardNrLabel;
+ private System.Windows.Forms.TextBox nameTextBox;
+ private System.Windows.Forms.Label nameLabel;
+ private System.Windows.Forms.Label classNameLabel;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.TextBox headPortNrTextBox;
+ private System.Windows.Forms.Label label2;
+ }
}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs
new file mode 100644
index 000000000..9e0f9487c
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs
@@ -0,0 +1,137 @@
+namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
+{
+ partial class IperlHeadTestCtrl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.optoTestGroupBox = new System.Windows.Forms.GroupBox();
+ this.optoListBox = new System.Windows.Forms.ListBox();
+ this.rfidOutputListBox = new System.Windows.Forms.ListBox();
+ this.RfidTestGroupBox = new System.Windows.Forms.GroupBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.rfidCommandComboBox = new System.Windows.Forms.ComboBox();
+ this.commandTestButton = new System.Windows.Forms.Button();
+ this.optoTestGroupBox.SuspendLayout();
+ this.RfidTestGroupBox.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // optoTestGroupBox
+ //
+ this.optoTestGroupBox.Controls.Add(this.optoListBox);
+ this.optoTestGroupBox.Location = new System.Drawing.Point(5, 4);
+ this.optoTestGroupBox.Name = "optoTestGroupBox";
+ this.optoTestGroupBox.Size = new System.Drawing.Size(591, 161);
+ this.optoTestGroupBox.TabIndex = 2;
+ this.optoTestGroupBox.TabStop = false;
+ this.optoTestGroupBox.Text = "Opto-data";
+ //
+ // optoListBox
+ //
+ this.optoListBox.FormattingEnabled = true;
+ this.optoListBox.ItemHeight = 16;
+ this.optoListBox.Location = new System.Drawing.Point(7, 22);
+ this.optoListBox.Name = "optoListBox";
+ this.optoListBox.Size = new System.Drawing.Size(573, 132);
+ this.optoListBox.TabIndex = 0;
+ //
+ // rfidOutputListBox
+ //
+ this.rfidOutputListBox.FormattingEnabled = true;
+ this.rfidOutputListBox.ItemHeight = 16;
+ this.rfidOutputListBox.Location = new System.Drawing.Point(5, 54);
+ this.rfidOutputListBox.Name = "rfidOutputListBox";
+ this.rfidOutputListBox.SelectionMode = System.Windows.Forms.SelectionMode.None;
+ this.rfidOutputListBox.Size = new System.Drawing.Size(575, 164);
+ this.rfidOutputListBox.TabIndex = 3;
+ //
+ // RfidTestGroupBox
+ //
+ this.RfidTestGroupBox.Controls.Add(this.rfidOutputListBox);
+ this.RfidTestGroupBox.Controls.Add(this.label2);
+ this.RfidTestGroupBox.Controls.Add(this.rfidCommandComboBox);
+ this.RfidTestGroupBox.Controls.Add(this.commandTestButton);
+ this.RfidTestGroupBox.Location = new System.Drawing.Point(5, 171);
+ this.RfidTestGroupBox.Name = "RfidTestGroupBox";
+ this.RfidTestGroupBox.Size = new System.Drawing.Size(591, 224);
+ this.RfidTestGroupBox.TabIndex = 3;
+ this.RfidTestGroupBox.TabStop = false;
+ this.RfidTestGroupBox.Text = "RFID / NFC data";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(2, 25);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(69, 16);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "Command";
+ //
+ // rfidCommandComboBox
+ //
+ this.rfidCommandComboBox.FormattingEnabled = true;
+ this.rfidCommandComboBox.Location = new System.Drawing.Point(86, 19);
+ this.rfidCommandComboBox.Name = "rfidCommandComboBox";
+ this.rfidCommandComboBox.Size = new System.Drawing.Size(341, 24);
+ this.rfidCommandComboBox.TabIndex = 1;
+ //
+ // commandTestButton
+ //
+ this.commandTestButton.Location = new System.Drawing.Point(449, 19);
+ this.commandTestButton.Name = "commandTestButton";
+ this.commandTestButton.Size = new System.Drawing.Size(126, 24);
+ this.commandTestButton.TabIndex = 0;
+ this.commandTestButton.Text = "Send command";
+ this.commandTestButton.UseVisualStyleBackColor = true;
+ this.commandTestButton.MouseClick += new System.Windows.Forms.MouseEventHandler(this.CommandTestButtonClick);
+ //
+ // IperlHeadTestCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.optoTestGroupBox);
+ this.Controls.Add(this.RfidTestGroupBox);
+ this.Name = "IperlHeadTestCtrl";
+ this.Size = new System.Drawing.Size(611, 432);
+ this.Load += new System.EventHandler(this.UserControl_Load);
+ this.optoTestGroupBox.ResumeLayout(false);
+ this.RfidTestGroupBox.ResumeLayout(false);
+ this.RfidTestGroupBox.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox optoTestGroupBox;
+ private System.Windows.Forms.ListBox rfidOutputListBox;
+ private System.Windows.Forms.GroupBox RfidTestGroupBox;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.ComboBox rfidCommandComboBox;
+ private System.Windows.Forms.Button commandTestButton;
+ private System.Windows.Forms.ListBox optoListBox;
+ }
+}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs
new file mode 100644
index 000000000..69e82e0ca
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.cs
@@ -0,0 +1,189 @@
+using System;
+using System.Threading;
+using System.Web.UI.WebControls;
+using System.Windows.Forms;
+using TBF.Rig.Sequences;
+
+namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
+{
+ public partial class IperlHeadTestCtrl : UserControl
+ {
+ IperlHeadCfg config;
+ IperlHead iPerlHead;
+ Thread optoThread;
+
+ private bool stopWorkerThread;
+ public event EventHandler OptoReceivedHandler;
+
+ public IperlHeadTestCtrl(IperlHeadCfg config)
+ {
+ this.config = config;
+ InitializeComponent();
+ if (config == null) return;
+
+ iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default values for iPerlCommunication
+
+ foreach(var head in ProcessData.IperlHeads)
+ {
+ if (head != null && head.Name == config.Name) { iPerlHead = head; }
+ }
+
+ rfidCommandComboBox.DisplayMember = "Name";
+ rfidCommandComboBox.ValueMember = "Value";
+ var items = new[]
+ {
+ new {Name = "Read PCB", Value = "ReadPCB" },
+ new {Name = "Set Test Mode", Value = "SetTestMode" },
+ new {Name = "Set Active Mode", Value = "SetActiveMode" },
+#if DEBUG
+ new {Name = "Start Read Opto Data", Value = "ReadOptoData" },
+ new {Name = "Stop Read Opto Data", Value = "StopReadOptoData" },
+#endif
+ new {Name = " ", Value = "" },
+ new {Name = "Reset NFC Head", Value = "ResetNfcHead" },
+ new {Name = "Set NFC Head Interface", Value = "SetNfcHead" },
+ new {Name = "Set RFID Head interface", Value = "SetRfidHead" }
+ };
+ /*
+ // CTRL+ALT+double click - hidden poweruser menu
+ if (((Keyboard.ModifierKeys & Keys.Control) == Keys.Control) && ((Keyboard.ModifierKeys & Keys.Alt) == Keys.Alt) && Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser)
+ {
+ Array.Resize(ref items, items.Length + 1);
+ items[items.Length - 1] = new { Name = "Kluc", Value = "Kluc" };
+ }
+ */
+ rfidCommandComboBox.DataSource = items;
+
+ stopWorkerThread = false;
+
+ OptoReceivedHandler += (EventHandler)((sndr, args) =>
+ {
+ if (this.InvokeRequired)
+ this.Invoke((Delegate)new EventHandler(this.OnOptoReceived2), sndr, (object)args);
+ else
+ this.OnOptoReceived2(sndr, args);
+ });
+ }
+
+ public void OnOptoReceived2(object sender, OptoReceivedEventArgs args)
+ {
+ optoListBox.Items.Insert(0,args.Data);
+ }
+
+ private void CommandTestButtonClick(object sender, MouseEventArgs e)
+ {
+ rfidOutputListBox.Items.Clear();
+
+ using (Tools.LogChecker logChecker = new Tools.LogChecker("RfidData", log4net.Core.Level.Debug))
+ {
+ ListItem rfidListItem = new ListItem();
+ rfidListItem.Attributes.Add("style", "font-weight:bold");
+ switch (rfidCommandComboBox.SelectedValue)
+ {
+ case "ReadPCB":
+ rfidListItem.Text = $"PCB: {OpticalHeadTest.ReadRequest_PCB(iPerlHead)}";
+ break;
+ case "SetTestMode":
+ rfidListItem.Text = OpticalHeadTest.SetTestMode(iPerlHead);
+ optoListBox.Items.Clear();
+ stopWorkerThread = false;
+ optoThread = new Thread(OptoWorker);
+ if (!optoThread.IsAlive)
+ {
+ iPerlHead.StartDataStreamProcessing(); // open opto port
+ optoThread.Start();
+ }
+ break;
+ case "SetActiveMode":
+ rfidListItem.Text = OpticalHeadTest.SetActiveMode(iPerlHead);
+ stopWorkerThread = true;
+ iPerlHead.StopDataStreamProcessing(); // close opto port
+ break;
+ case "ResetNfcHead":
+ iPerlHead.ResetNfcInterface();
+ break;
+ case "SetNfcHead":
+ iPerlHead.SetNfcInterface();
+ break;
+ case "SetRfidHead":
+ iPerlHead.SetRfidInterface();
+ break;
+ case "ReadOptoData":
+ optoListBox.Items.Clear();
+ stopWorkerThread = false;
+ optoThread = new Thread(OptoWorker);
+ if (optoThread.IsAlive)
+ {
+ stopWorkerThread = true;
+ iPerlHead.StopDataStreamProcessing(); // close opto port
+ }
+ if (!optoThread.IsAlive)
+ {
+ iPerlHead.StartDataStreamProcessing(); // open opto port
+ optoThread.Start();
+ }
+ break;
+ case "StopReadOptoData":
+ stopWorkerThread = true;
+ iPerlHead.StopDataStreamProcessing(); // close opto port
+ break;
+ }
+ rfidOutputListBox.Items.Add(rfidListItem);
+ rfidOutputListBox.Items.AddRange(logChecker.Messages.ToArray());
+ }
+ }
+
+ private void OptoWorker()
+ {
+ while (!this.stopWorkerThread)
+ {
+ Thread.Sleep(250);
+ if (this.stopWorkerThread)
+ break;
+
+ try
+ {
+ string buffer = iPerlHead.ReadOptoData();
+ if (string.IsNullOrEmpty(buffer))
+ {
+ this.OnOptoReceived((object)this, new OptoReceivedEventArgs("."));
+ }
+ else
+ OnOptoReceived((object)this, new OptoReceivedEventArgs(buffer));
+ }
+ catch (Exception ex)
+ {
+ this.OnOptoReceived((object)this, new OptoReceivedEventArgs(ex.Message));
+ }
+ }
+ }
+
+ public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
+ {
+ if (this.OptoReceivedHandler == null)
+ return;
+ try
+ {
+ this.OptoReceivedHandler(sender, args);
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+
+ private void UserControl_Load(object sender, EventArgs e)
+ {
+ this.ParentForm.FormClosing += new FormClosingEventHandler(ParentForm_FormClosing);
+ }
+
+ void ParentForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ //OnHandleDestroyed(new EventArgs());
+ stopWorkerThread = true;
+ if (optoThread != null)
+ {
+ optoThread.Abort();
+ }
+ }
+ }
+}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx
new file mode 100644
index 000000000..d58980a38
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs
new file mode 100644
index 000000000..41fd422c4
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs
@@ -0,0 +1,315 @@
+using log4net;
+using Sensus.iPerl.NfcHandler;
+using Sensus.iPerl.RfidCom.Exceptions;
+using System;
+using System.Globalization;
+using System.Text;
+using System.Threading;
+using static Sensus.iPerl.NfcHandler.MCI_Protocol;
+
+namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
+{
+ internal class NfcServices
+ {
+ protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
+ internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MCI_Protocol.StructName structName, int offset, int length, out byte[] buffer)
+ {
+ for (int i = 0; i < cfg.MaxCommRetries; i++)
+ {
+
+ NfcDataHandler _nfcDataHandler = new NfcDataHandler();
+ MessageEventHandlers(_nfcDataHandler);
+ CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader);
+ ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device);
+ MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol);
+ NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config);
+ try
+ {
+ rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length}");
+ OpenConnection(_nfcDataHandler, cfg, iperlHead);
+
+ buffer = MciRead(_nfcDataHandler, cfg, structName, (ushort)offset, length);
+ _nfcDataHandler.RFProtocolOFF(); // turn off rf antenna due to possible interference
+
+ CloseComPort(_nfcDataHandler);
+
+ rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length} ; Response= {ByteArrayToHexString(buffer)} ; Error: {_nfcDataHandler.LastErrorMessage}");
+
+ if (_nfcDataHandler.LastErrorCode != 0)
+ {
+ throw new RfidValidationException(_nfcDataHandler.LastErrorMessage);
+ }
+
+ return Convert.ToInt32(_nfcDataHandler.LastErrorCode); //return 0;
+ }
+ catch (RfidValidationException)
+ {
+ Thread.Sleep(cfg.WaitTimeAfterFailure);
+ }
+ catch (Exception ex)
+ {
+ rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} ReadRequest Error: {ex.Message}");
+ buffer = new byte[length];
+ return 3;
+ }
+ }
+ buffer = new byte[length];
+ return 3;
+ }
+
+ internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MCI_Protocol.StructName structName, int offset, int length, byte[] buffer)
+ {
+ NfcDataHandler _nfcDataHandler = new NfcDataHandler();
+ MessageEventHandlers(_nfcDataHandler);
+ CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader);
+ ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device);
+ MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol);
+ NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config);
+ try
+ {
+ rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} WriteRequest : {structName}, {offset}, {length}, {ByteArrayToHexString(buffer)}");
+ OpenConnection(_nfcDataHandler, cfg, iperlHead);
+
+ MciWrite(_nfcDataHandler, cfg, structName, (ushort)offset, length, buffer);
+ _nfcDataHandler.RFProtocolOFF(); // turn off rf antenna due to possible interference
+
+ CloseComPort(_nfcDataHandler);
+ return 0;
+ }
+ catch (Exception ex)
+ {
+ rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} WriteRequest Error: {ex.Message}");
+ return 3;
+ }
+ }
+
+ private static void OpenConnection(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, IperlHead iperlHead)
+ {
+ string comPort = $"COM{iperlHead.RfidComPortNr}";
+ int retryCount = 0 ;
+ Open:
+ nfcDataHandler.Close();
+ Thread.Sleep(100);
+ if (nfcDataHandler.OpenConnection(comPort, cfg.BaudRate, cfg.DataBits, cfg.ParityBit, cfg.StopBits))
+ {
+ rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Port Open");
+
+ if (nfcDataHandler.ConnectReader())
+ {
+ rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Reader connected");
+ if (!nfcDataHandler.ConnectDevice())
+ {
+ rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect device.");
+ for (int i = 0; i < cfg.MaxCommRetries; i++)
+ {
+ if (nfcDataHandler.Echo()) break;
+ }
+ }
+ }
+ else
+ {
+ retryCount++;
+ rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect reader. Reconnect comport {retryCount}");
+ if (retryCount < cfg.MaxCommRetries)
+ {
+ nfcDataHandler.Close();
+ iperlHead.ResetNfcInterface(); // reset NFC head via optoport - switch to RFID and back to NFC interface
+ goto Open;
+ }
+ }
+ }
+ else
+ rfidDataLogger.Error($"Open NFC COM{iperlHead.RfidComPortNr} Port Failed");
+ }
+
+ private static void CloseComPort(NfcDataHandler nfcDataHandler)
+ {
+ nfcDataHandler.Close();
+ }
+
+ private static byte[] MciRead(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, StructName structName, ushort offset, int length)
+ {
+ bool isReadValues = false;
+ int retryCount = 0;
+ Read:
+ try
+ {
+ isReadValues = false;
+ long num1 = (long)length;
+ int timeoutMs = 4000;
+ byte payloadlength = Convert.ToByte(num1.ToString("X2"), 16);
+ if (nfcDataHandler.MCI_Read(structName, offset, payloadlength, timeoutMs))
+ {
+ byte[] lastData = nfcDataHandler.LastData;
+ if ((long)lastData.Length >= num1)
+ {
+ rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}");
+ return lastData;
+ }
+ else
+ rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}");
+ }
+ else if (nfcDataHandler.LastErrorCode == (byte)0)
+ {
+ rfidDataLogger.Info($"MCI Error: Unidentified");
+ retryCount++;
+ if (retryCount < cfg.MaxCommRetries)
+ goto Read;
+ }
+ else
+ {
+ rfidDataLogger.Info("Last error message: " + nfcDataHandler.LastErrorMessage);
+ retryCount++;
+ if (retryCount < cfg.MaxCommRetries)
+ goto Read;
+ }
+ }
+ catch (Exception ex)
+ {
+ rfidDataLogger.Error("MciRead Last error message: " + ex.Message);
+ retryCount++;
+ if (retryCount < cfg.MaxCommRetries)
+ goto Read;
+ }
+ return new byte[length];
+ }
+
+ private static void MciWrite(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, MCI_Protocol.StructName structName, ushort offset, int length, byte[] payload)
+ {
+ int retryCount = 0;
+ Write:
+ try
+ {
+ long num1 = (long)length;
+ int timeoutMs = 4000;
+ byte payloadlength = Convert.ToByte(num1);
+ if ((int)payloadlength != payload.Length)
+ rfidDataLogger.Error("Insufficient Payload -- Payload lenth : " + (object)payload.Length);
+ else if (nfcDataHandler.MCI_Write(structName, offset, payloadlength, payload, timeoutMs))
+ {
+ // OK
+ }
+ else if (nfcDataHandler.LastErrorCode > (byte)0)
+ {
+ rfidDataLogger.Error("Last error message: " + nfcDataHandler.LastErrorMessage);
+ //int num2 = (int)MessageBox.Show(this._nfcDataHandler.LastErrorMessage);
+ }
+ }
+ catch (Exception ex)
+ {
+ rfidDataLogger.Error("MciWrite error message: " + ex.Message);
+ retryCount++;
+ if (retryCount < cfg.MaxCommRetries)
+ goto Write;
+ }
+ }
+
+ private static void MciWriteCommand(NfcDataHandler nfcDataHandler, byte commandcode)
+ {
+ try
+ {
+ ushort offset = 0;
+ int timeoutMs = 4000;
+ byte payloadlength = 1;
+ byte[] payload = new byte[1] { commandcode };
+ if (nfcDataHandler.MCI_Write(MCI_Protocol.StructName.Command, offset, payloadlength, payload, timeoutMs) || nfcDataHandler.LastErrorCode <= (byte)0)
+ return;
+ rfidDataLogger.Error("MciWriteCommand Last error message: " + nfcDataHandler.LastErrorMessage);
+ }
+ catch (Exception ex)
+ {
+ rfidDataLogger.Error("MciWriteCommand Last error message: " + ex.Message);
+ }
+ }
+
+ public static string ByteArrayToHexString(byte[] data)
+ {
+ StringBuilder stringBuilder = new StringBuilder();
+ foreach (byte num in data)
+ stringBuilder.Append(num.ToString("X2"));
+ return stringBuilder.ToString();
+ }
+
+ private static byte[] BuildPayLoad(string strPayLoad, int length)
+ {
+ byte[] collection;
+
+ if (strPayLoad.Split(':').Length > 1)
+ {
+ uint timestamp = ConvertDateTimeToTimestamp(Convert.ToDateTime(DateTime.ParseExact(strPayLoad, "HH:mm:ss dd/MM/yyyy", (IFormatProvider)CultureInfo.InvariantCulture)));
+ byte[] bytes = BitConverter.GetBytes(timestamp);
+ return bytes;
+ }
+ else if (strPayLoad.Split(',').Length > 1)
+ {
+ string[] strArray = strPayLoad.Split(',');
+ collection = new byte[strArray.Length];
+ for (int index3 = 0; index3 < strArray.Length; ++index3)
+ collection[index3] = Convert.ToByte(strArray[index3], 16);
+ return collection;
+ }
+ else
+ {
+ //int num = strPayLoad.Split(',').Length;
+ collection = HexStringToByteArray(strPayLoad.Substring(strPayLoad.Length - length * 2).ToUpper());
+ Array.Reverse((Array)collection);
+ return collection;
+ }
+ }
+
+ public static byte[] HexStringToByteArray(string hexString)
+ {
+ int length = hexString.Length;
+ byte[] byteArray = new byte[length / 2];
+ for (int startIndex = 0; startIndex < length; startIndex += 2)
+ byteArray[startIndex / 2] = Convert.ToByte(hexString.Substring(startIndex, 2), 16);
+ return byteArray;
+ }
+
+ private static uint ConvertDateTimeToTimestamp(DateTime datetime)
+ {
+ TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
+ return (uint)((datetime - new DateTime(2000, 1, 1, 0, 0, 0).ToLocalTime()).TotalSeconds + utcOffset.TotalSeconds);
+ }
+
+ #region EventHandlers
+ public static void MCI_MessageEventHandlers(MCI_Protocol e)
+ {
+ DelNfc_MCI_MessageHandler mciMessageHandler = new DelNfc_MCI_MessageHandler(OnHandler);
+ e.MessageEvent += mciMessageHandler;
+ }
+
+ public static void ST25DV_MessageEventHandlers(ST25DV_Device e)
+ {
+ DelNfc_ST25DV_MessageHandler dvMessageHandler = new DelNfc_ST25DV_MessageHandler(OnHandler);
+ e.MessageEvent += dvMessageHandler;
+ }
+
+ public static void CR95HF_MessageEventHandlers(CR95HF_Reader e)
+ {
+ DelNfc_CR95HF_MessageHandler hfMessageHandler = new DelNfc_CR95HF_MessageHandler(OnHandler);
+ e.MessageEvent += hfMessageHandler;
+ }
+
+ public static void NFCHeadConfig_MessageEventHandlers(NFCHeadConfig e)
+ {
+ DelNfc_NFCHeadConfig_MessageHandler configMessageHandler = new DelNfc_NFCHeadConfig_MessageHandler(OnHandler);
+ e.MessageEvent += configMessageHandler;
+ }
+
+ public static void MessageEventHandlers(NfcDataHandler e)
+ {
+ DelNfcMessageHandler nfcMessageHandler = new DelNfcMessageHandler(OnHandler);
+ e.MessageEvent += nfcMessageHandler;
+ }
+
+ public static void OnHandler(object sender, NfcMessageEventArgs e)
+ {
+ if (e.Message == null)
+ return;
+ string message = e.Message.Replace("\n", " ").Replace("\r", "");
+ rfidDataLogger.Debug(message);
+ }
+ #endregion
+ }
+}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs
index 291b8b7ec..56300811f 100644
--- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2015-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2023 Sensus Slovensko a.s.
///
using System;
using System.IO;
@@ -16,35 +16,30 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0];
public override XmlSerializer GetSerializer() { return Serializer; }
- public MeterType MeterType;
+ public int WMType_ID;
+ public MeterType MeterType;
public float CalibTarget; /// Target error after calibration in [%]
- public float CalibTargetQ2; /// Target error at Q2 after Q2 correction in [%]
public int FactorLimitLo; /// Lower limit for the calibration factor
public int FactorLimitHi; /// Upper limit for the calibration factor
public Counting Counting; /// Initial iPerl counting (Artbitrary, Positive or Negative)
- public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD
public override void InitializeAll()
{
MeterType = MeterType.AutoDetect;
CalibTarget = 0;
- CalibTargetQ2 = 0;
FactorLimitLo = 1000;
FactorLimitHi = 8000;
Counting = Counting.Arbitrary;
- WMType_ID = 2; /// Value for iPerl DN15
}
string[] paramNames = new string[]
{
"iPerl type",
"Calib. target [%]",
- "Calib. target at Q2 [%]",
"Calib. factor Lo",
"Calib. factor Hi",
"Counting",
- "WM type ID",
};
public override string ParamName(int i) { return paramNames[i]; }
public override int ParamsCount() { return paramNames.Length; }
@@ -72,11 +67,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
case 0: return MeterType.ToString();
case 1: return CalibTarget.ToString();
- case 2: return CalibTargetQ2.ToString();
- case 3: return FactorLimitLo.ToString();
- case 4: return FactorLimitHi.ToString();
- case 5: return Counting.ToString();
- case 6: return WMType_ID.ToString();
+ case 2: return FactorLimitLo.ToString();
+ case 3: return FactorLimitHi.ToString();
+ case 4: return Counting.ToString();
default: return string.Empty;
}
}
@@ -92,16 +85,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
}
break;
case 1: CalibTarget = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None;
- case 2: CalibTargetQ2 = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None;
- case 3: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None;
- case 4: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None;
- case 5:
+ case 2: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None;
+ case 3: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None;
+ case 4:
for (Counting c = 0; c < Counting.Count; c++)
{
if (c.ToString().Equals(strValue)) { Counting = c; return CfgUpdateFlags.None; }
}
break;
- case 6: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None;
default: return CfgUpdateFlags.None;
}
@@ -121,18 +112,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true;
break;
case 1:
- case 2:
if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true;
break;
+ case 2:
case 3:
- case 4:
if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true;
break;
- case 5:
+ case 4:
for (Counting c = 0; c < Counting.Count; c++) if (c.ToString().Equals(strValue)) return true;
- break;
- case 6: /// WMType_ID
- if (int.TryParse(strValue, out iDummy)) return true;
break;
default:
message = "Invalid index";
@@ -147,11 +134,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
{
prms.MeterType = this.MeterType;
prms.CalibTarget = this.CalibTarget;
- prms.CalibTargetQ2 = this.CalibTargetQ2;
prms.FactorLimitLo = this.FactorLimitLo;
prms.FactorLimitHi = this.FactorLimitHi;
prms.Counting = this.Counting;
- prms.WMType_ID = this.WMType_ID;
}
public IParamsProvider Clone()
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs
new file mode 100644
index 000000000..714697af5
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs
@@ -0,0 +1,123 @@
+using Sensus.iPerl.RfidCom.Exceptions;
+using Sensus.iPerl.RfidCom.Helper;
+using Sensus.iPerl.RfidCom;
+using System;
+using System.Text.RegularExpressions;
+using System.Threading;
+using log4net;
+
+namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
+{
+ internal class RfidServices
+ {
+ protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
+ private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm));
+
+ internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer)
+ {
+ for (int i = 0; i < cfg.MaxCommRetries; i++)
+ {
+ rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} reading: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},{offset}, {length}... timeout {cfg.CommTimeout})");
+ using (RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}"))
+ {
+ try
+ {
+ byte[] response = writer.ReadRequest((byte)messageID, offset, length, cfg.CommTimeout);
+ string hexString = RfidHelper.ConvertByteArrayToHexString(response);
+ string swapHexString = RfidHelper.SwapHexcode(hexString);
+ string decString = RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(hexString)).ToString();
+
+ if (length > 10)
+ {
+ //if the result only contains "00"s we are working on the wrong COM port
+ // or the module just isn't connected
+ if (Regex.IsMatch(hexString, @"^(00)\1+$"))
+ {
+ rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No RFID signal.");
+ throw new RfidValidationException("Error_Rfid_NoSignal");
+ }
+
+ //if the result only contains "03"s the meter did not answer.
+ // Might be due to the module being positioned incorrectly.
+ if (Regex.IsMatch(hexString, @"^(03)\1+$"))
+ {
+ rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No meter signal.");
+ throw new RfidValidationException("Error_Rfid_NoAnswerFromMeter");
+ }
+ }
+
+ writer.ClosePort();
+ buffer = response;
+ rfidDataLogger.Info($"{iperlHead.Name} ({iperlHead.SerialNr}): ReadRequestPort(COM{iperlHead.RfidComPortNr},...) returned HEX: {hexString}; SwapHexCodeToDecimal: {decString}");
+ return 0;
+ }
+ catch (RfidDataNotAvailableException)
+ {
+ if (/*RfidHelper.IsPassThrough(messageID)*/ messageID == MessageID.ASICRegisterReadTest || messageID == MessageID.RadioPassthrough)
+ {
+ rfidDataLogger.Info($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {(i > 0 ? "<- Error: Invalid Pass-Through data." : "<- Info: Wait for Pass-Through data.")}");
+ Thread.Sleep(cfg.PassThroughWaitTime);
+ }
+ else
+ {
+ Thread.Sleep(cfg.WaitTimeAfterFailure);
+ }
+ }
+ catch (RfidValidationException)
+ {
+ Thread.Sleep(cfg.WaitTimeAfterFailure);
+ }
+ catch (Exception ex)
+ {
+ rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {ex.Message}");
+ Thread.Sleep(cfg.WaitTimeAfterFailure);
+ }
+ }
+ }
+ rfidDataLogger.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)");
+ log.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)");
+ buffer = new byte[length];
+ return 3;
+ }
+
+ internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer)
+ {
+ RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}");
+ string payload = RfidHelper.ConvertByteArrayToHexString(buffer);
+
+ for (var i = 0; i < cfg.MaxCommRetries; i++)
+ {
+ rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} writting: COM{iperlHead.RfidComPortNr}: WriteRequest ({messageID},{offset}, {length}, {payload}... timeout {cfg.CommTimeout})");
+ try
+ {
+ if (writer.ClosePort()) writer.OpenPort();
+ writer.WriteRequest((byte)messageID, offset, length, buffer, cfg.CommTimeout, false);
+ writer.ClosePort();
+ rfidDataLogger.InfoFormat($"{iperlHead.Name}({iperlHead.SerialNr},COM{iperlHead.RfidComPortNr}): WriteRequestPort({messageID}, {offset}, {length}, {payload})");
+ return 0;
+ }
+ catch (Exception ex)
+ {
+ if (messageID == MessageID.RadioPassthrough || messageID == MessageID.ASICRegisterReadTest)
+ {
+ Thread.Sleep(1500);
+ }
+ else
+ {
+ rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Error: {ex.Message}");
+ Thread.Sleep(cfg.WaitTimeAfterFailure);
+ if (i > 1)
+ {
+ rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Reopen the com port.");
+ writer.ClosePort();
+ }
+ }
+ }
+ }
+ writer.ClosePort();
+ rfidDataLogger.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}");
+ log.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}");
+ return 2;
+ }
+ }
+}
diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs
new file mode 100644
index 000000000..5f6b46b69
--- /dev/null
+++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/SimulationServices.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Linq;
+
+namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
+{
+ internal class SimulationServices
+ {
+ const int Q2CorrFactorsAddr = 0x1878;
+
+ internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer)
+ {
+ byte[] configurationBuffer = new byte[ConfigStruct.Length] { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ byte[] calibrationBuffer = new byte[CalibrationStructV4.Length] { 3, 0, 150, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 150, 10 };
+ buffer = new byte[length];
+
+ if (messageID == MessageID.Configuration)
+ {
+ Array.Copy(GetPCB(iperlHead), 0, configurationBuffer, 16, 5); // set PCB Number according to iPerlHead configuration
+ Array.Copy(configurationBuffer,offset,buffer,0,length);
+ }
+ else if (messageID == MessageID.Calibration)
+ {
+ Array.Copy(calibrationBuffer, offset, buffer, 0, length);
+ }
+ else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2))
+ {
+ buffer = new byte[2] { 0, 0 };
+ }
+ else
+ {
+ buffer = new byte[length];
+ }
+
+ return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13
+ }
+
+ internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer)
+ {
+ return 0;
+ }
+
+ private static Array GetPCB(IperlHead iperlHead)
+ {
+ string pcbStr = iperlHead.RfidComPortNr.ToString().PadRight(10,'0') + iperlHead.Position.ToString("D2");
+ long decVal = Convert.ToInt64(pcbStr);
+ string nHexStr = decVal.ToString("X4");
+
+ string hexStr = "";
+ for (int a = nHexStr.Length; a >= 1; a = a - 2)
+ {
+ hexStr = hexStr + nHexStr.Substring(a - 2, 2);
+ }
+
+ return Enumerable.Range(0, hexStr.Length)
+ .Where(x => x % 2 == 0)
+ .Select(x => Convert.ToByte(hexStr.Substring(x, 2), 16))
+ .ToArray();
+
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/FlowMeter/FlowMeter.cs b/TBF/Rig/Uni/FlowMeter/FlowMeter.cs
index e24d75ac2..3700344e4 100644
--- a/TBF/Rig/Uni/FlowMeter/FlowMeter.cs
+++ b/TBF/Rig/Uni/FlowMeter/FlowMeter.cs
@@ -10,6 +10,7 @@ using SchematicDrawing;
using TBF.Rig.ControlBoard.Uni;
using TBF.Boxes;
using TBF.Resources;
+using AppDiagnostic;
namespace TBF.Rig.Uni.FlowMeter
{
diff --git a/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs b/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs
index 0f13af28c..b18becda3 100644
--- a/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs
+++ b/TBF/Rig/Uni/FlowMeter/FlowMeterCfg.cs
@@ -415,7 +415,7 @@ namespace TBF.Rig.Uni.FlowMeter
case 0:
return new string[] { "1", "2", "3", "4", "5", "6", "7" };
case 4:
- return new string[] { "m3/h", "l/h" };
+ return new string[] { "m3/h", "l/h", "gal/m" };
case 5:
return new string[] { "°C", "°F", "K" };
case 6:
@@ -488,7 +488,8 @@ namespace TBF.Rig.Uni.FlowMeter
case 1: NominalFlow = TBF.Utils.ParseUDouble(str); return CfgUpdateFlags.RestartRqrd;
case 2: NominalFreq = TBF.Utils.ParseUDouble(str); return CfgUpdateFlags.RestartRqrd;
case 3: MsrdFormat = str; return CfgUpdateFlags.RestartRqrd;
- case 4: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd;
+ //case 4: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd;
+ case 4: MsrdUnit = ParseFlowUnit(str); return CfgUpdateFlags.RestartRqrd;
case 5: TempUnit.ToDescription(); return CfgUpdateFlags.RestartRqrd;
case 6: PressureUnit.ToDescription(); return CfgUpdateFlags.RestartRqrd;
@@ -638,5 +639,15 @@ namespace TBF.Rig.Uni.FlowMeter
{
return true; /// =OK, do nothing
}
+ public static Unit ParseFlowUnit(string str)
+ {
+ switch (str)
+ {
+ case "l/h": return Unit.lph;
+ case "gal/m": return Unit.USgalpm;
+ case "m3/h":
+ default: return Unit.m3ph;
+ }
+ }
}
}
diff --git a/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs b/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs
index c5555b5bc..e59a94de6 100644
--- a/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs
+++ b/TBF/Rig/Uni/FlowMetersInParallel/FlowMeterCfg.cs
@@ -115,7 +115,7 @@ namespace TBF.Rig.Uni.FlowMetersInParallel
fmtrs.Add("---");
return fmtrs;
case 5:
- return new string[] { "m3/h", "l/h" };
+ return new string[] { "m3/h", "l/h", "gal/m" };
default:
return null;
}
@@ -148,7 +148,8 @@ namespace TBF.Rig.Uni.FlowMetersInParallel
case 2: Flowmeter3 = (str != "---") ? str : string.Empty; return CfgUpdateFlags.RestartRqrd;
case 3: InactiveFlowmtr = (str != "---") ? str : string.Empty; return CfgUpdateFlags.RestartRqrd;
case 4: MsrdFormat = str; return CfgUpdateFlags.RestartRqrd;
- case 5: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd;
+ //case 5: MsrdUnit = (str == "l/h") ? Unit.lph : Unit.m3ph; return CfgUpdateFlags.RestartRqrd;
+ case 5: MsrdUnit = ParseFlowUnit(str); return CfgUpdateFlags.RestartRqrd;
default:
return CfgUpdateFlags.None;
}
@@ -199,5 +200,15 @@ namespace TBF.Rig.Uni.FlowMetersInParallel
{
return true; /// =OK, do nothing
}
+ public static Unit ParseFlowUnit(string str)
+ {
+ switch (str)
+ {
+ case "l/h": return Unit.lph;
+ case "gal/m": return Unit.USgalpm;
+ case "m3/h":
+ default: return Unit.m3ph;
+ }
+ }
}
}
diff --git a/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs b/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs
index 07efc054d..e4ff3520d 100644
--- a/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs
+++ b/TBF/Rig/Uni/RegValve/ChangeRegValvePositionOp.cs
@@ -1,10 +1,9 @@
///
-/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
+/// Copyright (c) 2021 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using log4net;
-using TBF.Rig.ControlBoard.Uni;
using TBF.Rig.GenericDevices;
namespace TBF.Rig.Uni.RegValve
@@ -14,12 +13,12 @@ namespace TBF.Rig.Uni.RegValve
private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegValvePositionOp));
public override string ToString()
{
- return string.Format("ChangeRegValvePositionOp({0},{1}s)", regV.Name, timePulseSec.ToString("F2"));
+ return string.Format("ChangeRegValvePositionOp({0},{1}s)", regulValve.Name, timePulseSec.ToString("F2"));
}
/// Set by the constructor
- readonly UniCB uniCB;
- readonly RegValve regV;
+ readonly TBF.Rig.ControlBoard.Uni.UniCB controlBoard;
+ readonly RegValve regulValve;
readonly int regulValveNr;
readonly double timePulseSec;
@@ -33,14 +32,14 @@ namespace TBF.Rig.Uni.RegValve
/// Upper limit of the position to be achieved
/// Timeout in sec. for setting the flow
/// Only Elde.Valve flow are used, other flow on the lists are ignored
- public ChangeRegValvePositionOp(UniCB uniCB, RegValve regV, double timePulseSec)
+ public ChangeRegValvePositionOp(TBF.Rig.ControlBoard.IControlBoard cb, RegValve rv, double timePulseSec)
{
- this.uniCB = uniCB;
- if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard");
+ controlBoard = cb as TBF.Rig.ControlBoard.Uni.UniCB;
+ if (controlBoard == null) throw new ArgumentNullException("ctrlBoard");
- this.regV = regV as RegValve;
- if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni");
- regulValveNr = this.regV.Idx1;
+ regulValve = rv as RegValve;
+ if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde");
+ regulValveNr = this.regulValve.Idx1;
this.timePulseSec = timePulseSec;
@@ -50,7 +49,13 @@ namespace TBF.Rig.Uni.RegValve
/// Start this operation
public void Start()
{
- uniCB.RegVlvIncrMove(false, regulValveNr, timePulseSec);
+ //double positionPct = controlBoard.RValvePosition(regulValveNr);
+ //log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1"));
+
+ //controlBoard.ValveMove(regulValveNr,
+ // TBF.Rig.ControlBoard.Legacy.RegulValveMode.PulseWidth,
+ // new double[2] { timePulseSec, timePulseSec },
+ // regulValve.StableTime);
}
/// Run this operation
@@ -59,6 +64,9 @@ namespace TBF.Rig.Uni.RegValve
///
public Event Run()
{
+ //float positionPct = controlBoard.RValvePosition(regulValveNr);
+ //log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1"));
+
return Event.PositionReached;
}
diff --git a/TBF/Rig/Uni/RegValve/Factory.cs b/TBF/Rig/Uni/RegValve/Factory.cs
index 4c0c96e9c..0c0dafb98 100644
--- a/TBF/Rig/Uni/RegValve/Factory.cs
+++ b/TBF/Rig/Uni/RegValve/Factory.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2021 Sensus Slovensko a.s.
+/// Copyright (c) 2021 Sensus Metering Systems
///
using System.Collections.Generic;
using TBF.Rig.Generic;
diff --git a/TBF/Rig/Uni/RegValve/Handlers.cs b/TBF/Rig/Uni/RegValve/Handlers.cs
index b16a486f6..2ba144a37 100644
--- a/TBF/Rig/Uni/RegValve/Handlers.cs
+++ b/TBF/Rig/Uni/RegValve/Handlers.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2021 Sensus Slovensko a.s.
+/// Copyright (c) 2021 Sensus Metering Systems
///
using System;
using log4net;
diff --git a/TBF/Rig/Uni/RegValve/RegValve.cs b/TBF/Rig/Uni/RegValve/RegValve.cs
index d8282b0a4..33483d05f 100644
--- a/TBF/Rig/Uni/RegValve/RegValve.cs
+++ b/TBF/Rig/Uni/RegValve/RegValve.cs
@@ -32,30 +32,15 @@ namespace TBF.Rig.Uni.RegValve
public bool StoredPositionReuse { get { return regValveCfg.StoredPositionReuse; } }
///
public bool IsCoax { get { return false; } }
-
- public RegValveState RegValveState
- {
- get
- {
- switch (UniCB.Data.RegVStatus[Idx1 - 1])
- {
- default:
- case 0: return ControlBoard.Uni.RegValveState.Idle;
- case 2: return ControlBoard.Uni.RegValveState.PwOrFreqRegul;
- case 3: return ControlBoard.Uni.RegValveState.DacValueRegul;
- }
- }
- }
-
- /// Position 0.0 .. 100.0 in %
+
+ /// 0.0 .. 100.0
public double Position
{
get
{
int denominator = DacValueOpen - DacValueClosed;
if (denominator == 0) denominator = 1;
- return 100.0 * Convert.ToDouble(Math.Max(0, Math.Min(denominator, (int)UniCB.AnalogInput(adcChannel) - DacValueClosed)))
- / Convert.ToDouble(denominator);
+ return 100.0 * Convert.ToDouble(UniCB.AnalogInput(adcChannel) - DacValueClosed) / Convert.ToDouble(denominator);
}
}
///
@@ -76,6 +61,7 @@ namespace TBF.Rig.Uni.RegValve
}
int adcChannel;
+ public RegValveState RegValveState;
public double TargetRegValvePosition;
@@ -93,15 +79,11 @@ namespace TBF.Rig.Uni.RegValve
///
/// Reg. valve ID
/// Reg. valve position (0 .. 1.0)
- public void MoveToPosition(bool isFromUI, double posPctLo, double posPctHi = -1)
+ public void MoveToPosition(bool isFromUI, double positionLo, double positionHi = -1)
{
- int adcDiff = Math.Abs(regValveCfg.AdcValueOpen - regValveCfg.AdcValueClosed);
- int adcLower = Math.Min(regValveCfg.AdcValueOpen, regValveCfg.AdcValueClosed);
-
- int targetAdcValLo = Math.Max(0, Convert.ToInt32(Math.Round((posPctLo * adcDiff / 100.0) + adcLower)));
- int targetAdcValHi = (posPctHi < 0) ? -1 : Math.Min(1023, Convert.ToInt32(Math.Round((posPctHi * adcDiff / 100.0) + adcLower)));
-
- UniCB.RegVlvMoveToPos(isFromUI, Idx1, targetAdcValLo, targetAdcValHi);
+ int positionLoInt = Convert.ToInt32(positionLo);
+ int positionHiInt = Convert.ToInt32(positionHi);
+ UniCB.RegVlvMoveToPos(isFromUI, Idx1, positionLoInt, positionHiInt);
}
@@ -157,6 +139,8 @@ namespace TBF.Rig.Uni.RegValve
this.UniCB = TbfComponents.FindComponent(cfg.ParentName, components) as UniCB;
if (this.UniCB == null) throw new Exception(string.Format("Cannot find {0} (a parent of {1})", cfg.ParentName, Name));
+
+ log.Warn(this.ToString());
}
public override void Initialize()
@@ -171,8 +155,6 @@ namespace TBF.Rig.Uni.RegValve
if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint();
}
};
-
- log.FatalFormat("{0} initialized: {1}", Name, this);
}
///
diff --git a/TBF/Rig/Uni/RegValve/SetFlowOp.cs b/TBF/Rig/Uni/RegValve/SetFlowOp.cs
index f69caab35..02f301cdb 100644
--- a/TBF/Rig/Uni/RegValve/SetFlowOp.cs
+++ b/TBF/Rig/Uni/RegValve/SetFlowOp.cs
@@ -3,7 +3,6 @@
///
using System;
using System.Collections.Generic;
-using Common;
using log4net;
using Config.Entities;
using TBF.Rig.ControlBoard.Uni;
@@ -20,10 +19,11 @@ namespace TBF.Rig.Uni.RegValve
return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2})", regV.Name, shrinkedTgtFlowLo, shrinkedTgtFlowHi);
}
+
public const double RqrdFlowRangeRatio = 0.5;
///
- /// Set by the constructor
+ /// Set by the constructor
///
readonly UniCB uniCB;
readonly RegValve regV;
@@ -36,8 +36,8 @@ namespace TBF.Rig.Uni.RegValve
readonly bool leaveFlowControlRunning;
readonly double maximalFlow;
-
- ///
+
+ ///
/// Internal state of this operation
///
enum OpState
@@ -56,12 +56,13 @@ namespace TBF.Rig.Uni.RegValve
double currentReqFlowLo;
double currentReqFlowHi;
- double targetPositionLo;
- double targetPositionHi;
+ double targetPositionLo;
+ double targetPositionHi;
+ int startTime;
int setFlowTime;
int expireTime;
- DoubleBox msrdFlow;
+ DoubleBox flowBox;
int isFlowOkDuration;
@@ -70,23 +71,23 @@ namespace TBF.Rig.Uni.RegValve
/// Events: FlowSet, FlowTimeOut
///
/// Control board device
- /// Regulation valve component
+ /// Regulation valve component
/// Flowmeter component
/// Lower limit of the flow to be achieved in [m3/h]
/// Upper limit of the flow to be achieved in [m3/h]
- /// DoubleBox for measured flow
+ /// PID coefficient (float)
/// Timeout for the flow setting in [s]
- /// Flow setting starts after this delay in [s]
+ /// Flow setting starts after this delay [s]
/// true = Leave the measurement running after op. stop
/// Only Elde.Valve flow are used, other flow on the lists are ignored
- public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox msrdFlow,
+ public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowBox,
int timeout, int delay, bool leaveFlowControlRunning)
{
- this.uniCB = uniCB;
- if (this.uniCB == null) throw new ArgumentNullException("Control board is null or not Uni");
+ this.uniCB = uniCB;
+ if (this.uniCB == null) throw new ArgumentNullException("cBoard is null or not Uni");
this.regV = regValve as RegValve;
- if (this.regV == null) throw new ArgumentNullException(string.Format("{0} is not Uni.RegValve", regValve.Name));
+ if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni");
this.flowMeter = flowMeter;
if (this.flowMeter == null) throw new ArgumentNullException("flowMeter");
@@ -96,14 +97,15 @@ namespace TBF.Rig.Uni.RegValve
double rqrdFlowLoBeforeCorr = qFrom - MeasurementCorrection.GetCorrection(qFrom, flowMeter.Corrections);
double rqrdFlowHiBeforeCorr = qTo - MeasurementCorrection.GetCorrection(qTo, flowMeter.Corrections);
targetFlowAve = (rqrdFlowLoBeforeCorr + rqrdFlowHiBeforeCorr) / 2;
- shrinkedTgtFlowLo = (RqrdFlowRangeRatio * rqrdFlowLoBeforeCorr)
- + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the lower limit 15% of the range up
- shrinkedTgtFlowHi = (RqrdFlowRangeRatio * rqrdFlowHiBeforeCorr)
- + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the upper limit 15% of the range down
+ shrinkedTgtFlowLo = (RqrdFlowRangeRatio * rqrdFlowLoBeforeCorr) + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the lower limit 15% of the range up
+ shrinkedTgtFlowHi = (RqrdFlowRangeRatio * rqrdFlowHiBeforeCorr) + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the upper limit 15% of the range down
+
+ this.flowBox = flowBox;
+ if (this.flowBox == null) throw new ArgumentNullException("flowBox");
- this.msrdFlow = msrdFlow;
this.timeout = timeout;
this.delay = delay;
+
this.leaveFlowControlRunning = leaveFlowControlRunning;
log.Debug(this.ToString());
@@ -169,13 +171,16 @@ namespace TBF.Rig.Uni.RegValve
return;
}
- /// Start this operation
+ ///
+ /// Start this operation
+ ///
public void Start()
{
log.InfoFormat("SetFlowOp:Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}",
regV.Idx1, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi);
/// Store the current time, etc.
+ startTime = StateMachine.Time;
setFlowTime = StateMachine.Time + delay;
expireTime = StateMachine.Time + timeout;
if (expireTime < 0) expireTime = int.MaxValue;
@@ -206,8 +211,6 @@ namespace TBF.Rig.Uni.RegValve
if (opState == OpState.Wait4FlowMsrmntAndSendRVMove)
{
- if (flowMeter.DebugLevel == DebugMode.Simulate) return Event.FlowReached;
-
if (!flowMeter.MsrmntAvailable) return Event.Starting;
double flow1 = flowMeter.ReadFlow();
@@ -225,8 +228,8 @@ namespace TBF.Rig.Uni.RegValve
if (StateMachine.Time > setFlowTime)
{
- uniCB.SetFlow(false, regV.Idx1, flowMeter.NominalFreq * currentReqFlowLo / flowMeter.NominalFlow,
- flowMeter.NominalFreq * currentReqFlowHi / flowMeter.NominalFlow);
+ uniCB.SetFlow(false, regV.Idx1, 2000.0 * currentReqFlowLo / flowMeter.NominalFlow,
+ 2000.0 * currentReqFlowHi / flowMeter.NominalFlow);
log.InfoFormat("Run(): rv#={0} TARGET: flowLo={1} flowHi={2}", regV.Idx1, currentReqFlowLo, currentReqFlowHi);
@@ -270,16 +273,17 @@ namespace TBF.Rig.Uni.RegValve
///
double frequency = flowMeter.ReadFrequency();
double flow = flowMeter.ReadFlow();
- if (msrdFlow != null && flow != 0) msrdFlow.Val = flow;
+ if (flow != 0) flowBox.Val = flow;
- if (currentReqFlowLo <= flow && flow <= currentReqFlowHi)
+ if ((currentReqFlowLo <= flow) && (flow <= currentReqFlowHi))
{
- isFlowOkDuration++; /// Increment the flow within range duration
+ /// Flow is within range
+ isFlowOkDuration++;
if (isFlowOkDuration >= regV.FlowStableSec)
{
/// Flow is within range for sufficiently long time
- if (regV.StoredPositionReuse)
+ if (regV.regValveCfg.StoredPositionReuse)
{
double rvPosition = regV.Position; /// Read the current position
double storedPosition;
@@ -326,12 +330,13 @@ namespace TBF.Rig.Uni.RegValve
}
}
- /// Stop this operation
+ /// Start this operation
public void Stop()
{
if (!leaveFlowControlRunning)
{
- uniCB.StopFlowControl(false, regV.Idx1); /// Stop the flow measurement
+ /// Stop flow measurement
+ uniCB.StopFlowControl(false, regV.Idx1);
}
opState = OpState.Idle;
diff --git a/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs b/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs
index c81e97844..4ce9539d4 100644
--- a/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs
+++ b/TBF/Rig/Uni/RegValve/SetRegValvePositionOp.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2021-2022 Sensus Slovensko a.s.
+/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -17,6 +17,8 @@ namespace TBF.Rig.Uni.RegValve
return string.Format("SetRegValvePositionOp({0},{1},{2})", regV.Name, posLoPct, posHiPct);
}
+ const int CoaxValveNr = 7; /// Coax. valve has number 7
+
///
/// Internal states of this operation
///
@@ -30,7 +32,7 @@ namespace TBF.Rig.Uni.RegValve
OpState opState;
/// Set by the constructor
- readonly UniCB uniCB;
+ readonly UniCB cBoard;
readonly RegValve regV;
readonly int regValveNr;
readonly double posLoPct;
@@ -45,23 +47,24 @@ namespace TBF.Rig.Uni.RegValve
/// Set required water flow.
/// Events: FlowSet, FlowTimeOut
///
- /// Control board device
+ /// Control board device
/// Regulation valve component
/// Lower limit of the position to be achieved
/// Upper limit of the position to be achieved
/// Timeout in sec. for setting the flow
/// Only Elde.Valve flow are used, other flow on the lists are ignored
- public SetRegValvePositionOp(UniCB uniCB, RegValve regV, double posLoPct, double posHiPct, int timeout)
+ public SetRegValvePositionOp(UniCB cBoard, RegValve regValve, double posLoPct, double posHiPct, int timeout)
{
- this.uniCB = uniCB;
- if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard");
+ this.cBoard = cBoard;
+ if (this.cBoard == null) throw new ArgumentNullException("ctrlBoard");
- this.regV = regV as RegValve;
- if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni");
+ this.regV = regValve as RegValve;
+ if (this.regV == null) throw new ArgumentNullException("regValve is null or not Elde");
this.regValveNr = this.regV.Idx1;
this.posLoPct = posLoPct;
this.posHiPct = posHiPct;
+
this.timeout = timeout;
log.Debug(this.ToString());
@@ -85,9 +88,7 @@ namespace TBF.Rig.Uni.RegValve
opState = OpState.MoveToPosition;
}
- ///
- /// Run this operation
- ///
+ /// Run this operation
///
/// Event.None . . . . . . . busy adjusting position
/// Event.PositionReached . . position reached
@@ -97,25 +98,29 @@ namespace TBF.Rig.Uni.RegValve
{
if (opState == OpState.MoveToPosition)
{
- if (posLoPct >= posHiPct || posLoPct > 100.0 || posHiPct < 0)
+ if (posLoPct >= posHiPct || posLoPct > 100.0f || posHiPct < 0)
{
return Event.OpArgumentError;
}
regV.MoveToPosition(false, posLoPct, posHiPct);
- opState = OpState.CheckState;
- log.WarnFormat("Run(): RV#={0}, state={1}, MoveToPosition(false, {2:D1}, {3:D1}) issued", regValveNr, opState, posLoPct, posHiPct);
+ opState = OpState.CheckState;
return Event.None;
}
if (positionReached) return Event.PositionReached;
double positionPct = regV.Position;
- log.WarnFormat("Run(): RV#={0}, state={1}, pos={2}%", regValveNr, opState, positionPct.ToString("F1"));
+ log.WarnFormat("Run(): RV#={0}, actPos={1}%", regValveNr, positionPct.ToString("F1"));
if (opState == OpState.CheckState)
{
- if (posLoPct <= positionPct && positionPct <= posHiPct)
+ if (regValveNr == CoaxValveNr && (cBoard.State & (ulong)StatusP.CoaxRegValveBusy) == 0)
+ {
+ opState = OpState.MoveToPosition;
+ return Event.None;
+ }
+ else if (posLoPct <= positionPct && positionPct <= posHiPct)
{
positionReached = true;
return Event.PositionReached;
@@ -148,8 +153,6 @@ namespace TBF.Rig.Uni.RegValve
}
/// Stop this operation
- public void Stop()
- {
- }
+ public void Stop() { }
}
}
diff --git a/TBF/Rig/Uni/RegValveAnalog/RegValve.cs b/TBF/Rig/Uni/RegValveAnalog/RegValve.cs
index 634324dbb..f82f5e3cd 100644
--- a/TBF/Rig/Uni/RegValveAnalog/RegValve.cs
+++ b/TBF/Rig/Uni/RegValveAnalog/RegValve.cs
@@ -43,6 +43,8 @@ namespace TBF.Rig.Uni.RegValveAnalog
return (1 / CalibDA) * uniCB.Data.StavDA[0];
}
}
+ ///
+ public int RegulationMinStep { get { return 0; } } /// Analog RegValve not operates with this variable
///
public double SetpointVal
{
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs
new file mode 100644
index 000000000..0a398fcde
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/ChangeRegValvePositionOp.cs
@@ -0,0 +1,70 @@
+///
+/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using log4net;
+using TBF.Rig.ControlBoard.Uni;
+using TBF.Rig.GenericDevices;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public class ChangeRegValvePositionOp : IOperation
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegValvePositionOp));
+ public override string ToString()
+ {
+ return string.Format("ChangeRegValvePositionOp({0},{1}s)", regV.Name, timePulseSec.ToString("F2"));
+ }
+
+ /// Set by the constructor
+ readonly UniCB uniCB;
+ readonly RegValve regV;
+ readonly int regulValveNr;
+ readonly double timePulseSec;
+
+ ///
+ /// Set required water flow.
+ /// Events: FlowSet, FlowTimeOut
+ ///
+ /// Control board device
+ /// Regulation valve component
+ /// Lower limit of the position to be achieved
+ /// Upper limit of the position to be achieved
+ /// Timeout in sec. for setting the flow
+ /// Only Elde.Valve flow are used, other flow on the lists are ignored
+ public ChangeRegValvePositionOp(UniCB uniCB, RegValve regV, double timePulseSec)
+ {
+ this.uniCB = uniCB;
+ if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard");
+
+ this.regV = regV as RegValve;
+ if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni");
+ regulValveNr = this.regV.Idx1;
+
+ this.timePulseSec = timePulseSec;
+
+ log.Debug(this.ToString());
+ }
+
+ /// Start this operation
+ public void Start()
+ {
+ uniCB.RegVlvIncrMove(false, regulValveNr, timePulseSec, this.regV.RegulationMinStep);
+ }
+
+ /// Run this operation
+ ///
+ /// Event.SetFlowDone
+ ///
+ public Event Run()
+ {
+ return Event.PositionReached;
+ }
+
+ /// Stop this operation
+ public void Stop()
+ {
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs
new file mode 100644
index 000000000..52d05f2f8
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Factory.cs
@@ -0,0 +1,25 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System.Collections.Generic;
+using TBF.Rig.Generic;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public class Factory : IComponentFactory
+ {
+ public string ClassName { get { return GetType().Namespace.Substring(12); } }
+ public override string ToString() { return ClassName; }
+
+ public IComponent DummyComponent() { return new RegValve(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegValve(cfg, components); }
+
+ public IComponentCfg DefaultConfig() { return new RegValveCfg("VR", this); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ return ComponentCfgBase.CreateFromDbEntity(RegValveCfg.Serializer, component, this);
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs
new file mode 100644
index 000000000..1aa203913
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/Handlers.cs
@@ -0,0 +1,36 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+using log4net;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ static class Handlers
+ {
+ static readonly ILog log = LogManager.GetLogger(typeof(Handlers));
+
+ static Handlers()
+ {
+ }
+
+ ///
+ /// Called from the state machine when a procedure is selected and UI needs to be updated.
+ ///
+ public static void OnAdcChanged(object sender, CmdResponseArgs data)
+ {
+ if (AdcChangedHandler == null)
+ return;
+
+ try
+ {
+ AdcChangedHandler(sender, data);
+ }
+ catch (Exception e)
+ {
+ log.Error("AdcChangedHandler(...) failed", e);
+ }
+ }
+ public static event EventHandler AdcChangedHandler;
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs
new file mode 100644
index 000000000..d43935b5e
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValve.cs
@@ -0,0 +1,243 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using log4net;
+using SchematicDrawing;
+using TBF.Rig.ControlBoard.Uni;
+using TBF.Boxes;
+using SharedComponents;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public class RegValve : ComponentBase, Generic.IDevice, GenericDevices.IRegValve, IDrawingItCmpntWithSetpoint
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(RegValve));
+ public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); }
+
+ public readonly RegValveCfg regValveCfg;
+ public IDrawingItem DrawingItem { get { return regValveCfg as IDrawingItem; } }
+
+ IDictionary dict;
+ public IDictionary Dict { get { return dict; } }
+
+ public readonly UniCB UniCB;
+
+ public ValveCategory Category { get { return regValveCfg.Category; } }
+ public int Idx1 { get { return regValveCfg.Idx1; } } /// 1 .. 8
+ public int DacValueClosed { get { return regValveCfg.AdcValueClosed; } } /// 0 .. 1023
+ public int DacValueOpen { get { return regValveCfg.AdcValueOpen; } } /// 0 .. 1023
+ public int StableTime { get { return regValveCfg.StableTime; } } /// 0=200ms, step=50ms, max. 1500ms (max.26)
+ public int FlowStableSec { get { return regValveCfg.FlowStableSec; } } /// 0 .. 60 sec
+ public bool StoredPositionReuse { get { return regValveCfg.StoredPositionReuse; } }
+ public int RegulationMinStep { get { return regValveCfg.RegulationMinStep; } } /// low regulation saturation time ...0=0, 1=50, 2=100, 3=150, 4=200, 5=250, 6=300 [ms]
+ ///
+ public bool IsCoax { get { return false; } }
+
+ public RegValveState RegValveState
+ {
+ get
+ {
+ switch (UniCB.Data.RegVStatus[Idx1 - 1])
+ {
+ default:
+ case 0: return ControlBoard.Uni.RegValveState.Idle;
+ case 2: return ControlBoard.Uni.RegValveState.PwOrFreqRegul;
+ case 3: return ControlBoard.Uni.RegValveState.DacValueRegul;
+ }
+ }
+ }
+
+ /// Position 0.0 .. 100.0 in %
+ public double Position
+ {
+ get
+ {
+ int denominator = DacValueOpen - DacValueClosed;
+ if (denominator == 0) denominator = 1;
+ return 100.0 * Convert.ToDouble(Math.Max(0, Math.Min(denominator, (int)UniCB.AnalogInput(adcChannel) - DacValueClosed)))
+ / Convert.ToDouble(denominator);
+ }
+ }
+ ///
+ public double SetpointVal
+ {
+ get { return Position; }
+ set { TargetRegValvePosition = value; }
+ }
+ ///
+ public void IncreaseSetpoint()
+ {
+ IncrementalMovement(true, 0.5);
+ }
+ ///
+ public void DecreaseSetpoint()
+ {
+ IncrementalMovement(true, -0.5);
+ }
+
+ int adcChannel;
+ public double TargetRegValvePosition;
+
+
+ ///
+ /// Incremental movement of the regulation valve.
+ ///
+ /// Time in seconds, positive value opens the reg. valve
+ public void IncrementalMovement(bool isFromUI, double time)
+ {
+ UniCB.RegVlvIncrMove(isFromUI, Idx1, time, RegulationMinStep);
+ }
+
+ ///
+ /// Move a regulation valve to specfied position
+ ///
+ /// Reg. valve ID
+ /// Reg. valve position (0 .. 1.0)
+ public void MoveToPosition(bool isFromUI, double posPctLo, double posPctHi = -1)
+ {
+ int adcDiff = Math.Abs(regValveCfg.AdcValueOpen - regValveCfg.AdcValueClosed);
+ int adcLower = Math.Min(regValveCfg.AdcValueOpen, regValveCfg.AdcValueClosed);
+
+ int targetAdcValLo = Math.Max(0, Convert.ToInt32(Math.Round((posPctLo * adcDiff / 100.0) + adcLower)));
+ int targetAdcValHi = (posPctHi < 0) ? -1 : Math.Min(1023, Convert.ToInt32(Math.Round((posPctHi * adcDiff / 100.0) + adcLower)));
+
+ UniCB.RegVlvMoveToPos(isFromUI, Idx1, targetAdcValLo, targetAdcValHi, RegulationMinStep);
+ }
+
+
+ #region Configuration Change Handling
+
+ public static void OnCfgChange(object sender, CfgChangeArgs args)
+ {
+ if (CfgChangeHandler == null) return;
+ try { CfgChangeHandler(sender, args); }
+ catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CfgChangeHandler;
+
+ public override void StartChangeHandler()
+ {
+ CfgChangeHandler += delegate(object sender, CfgChangeArgs args)
+ {
+ RegValveCfg tmpcfg = args.Cfg as RegValveCfg;
+ if (tmpcfg != null && tmpcfg.Name.Equals(Name))
+ {
+ if (args.Command == CfgChangeCmd.CfgChange)
+ {
+ regValveCfg.StableTimeMs = tmpcfg.StableTimeMs;
+ regValveCfg.FlowStableSec = tmpcfg.FlowStableSec;
+ regValveCfg.RegulationMinStep = tmpcfg.RegulationMinStep;
+ }
+ else if (args.Command == CfgChangeCmd.RVOpenStep)
+ {
+ IncrementalMovement(true, 0.5); /// true = command is comming from the UI
+ }
+ else if (args.Command == CfgChangeCmd.RVCloseStep)
+ {
+ IncrementalMovement(true, -0.5); /// true = command is comming from the UI
+ }
+ else if (args.Command == CfgChangeCmd.GetAdc1 || args.Command == CfgChangeCmd.GetAdc2)
+ {
+ short adcValue = UniCB.AnalogInput(adcChannel);
+ RegValveCfgCtrl.OnCmdResponse(this, new CmdResponseArgs(args.Command, Idx1, adcValue));
+ }
+ }
+ };
+ }
+
+ #endregion Configuration Change Handling
+
+
+ public RegValve() { }
+
+ public RegValve(Generic.IComponentCfg cfg, IList components)
+ : base(cfg)
+ {
+ regValveCfg = cfg as RegValveCfg;
+
+ this.UniCB = TbfComponents.FindComponent(cfg.ParentName, components) as UniCB;
+ if (this.UniCB == null) throw new Exception(string.Format("Cannot find {0} (a parent of {1})", cfg.ParentName, Name));
+ }
+
+ public override void Initialize()
+ {
+ adcChannel = regValveCfg.Idx1 - 1;
+ this.dict = new Dictionary();
+
+ TBF.UiBridge.Bridge.SetpointChangeHandler += delegate(object sndr, TBF.UiBridge.SetpointChangeArgs args)
+ {
+ if (args.Name == Name)
+ {
+ if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint();
+ }
+ };
+
+ log.FatalFormat("{0} initialized: {1}", Name, this);
+ }
+
+ ///
+ /// IDevice interface implementation
+ ///
+ public void RunDeviceBefore()
+ {
+ Int16 adcValue = UniCB.AnalogInput(adcChannel);
+ Handlers.OnAdcChanged(this, new CmdResponseArgs(CfgChangeCmd.GetAdc, Idx1, adcValue));
+ }
+ public void RunDeviceAfter() { }
+ public void StopDevice() { }
+ public void StopDevice2() { }
+
+
+ ///
+ /// Operation to set the water flow within tolerances
+ /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut
+ ///
+ /// Flowmeter component
+ /// Lower limit of the required flow [m3/h]
+ /// Higher limit of the required flow [m3/h]
+ /// PID coefficient (float)
+ /// Measured flow [m3/h]
+ /// Timeout in [s]
+ /// SetFlowOp instance
+ public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, double requiredFlowLo, double requiredFlowHi, DoubleBox measuredFlow, int timeout, int delay)
+ {
+ return new SetFlowOp(UniCB, this, flowMeter, requiredFlowLo, requiredFlowHi, measuredFlow, timeout, delay);
+ }
+
+ ///
+ /// Operation to set the water flow within tolerances. Leave the measurement running.
+ /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut
+ ///
+ /// Flowmeter component
+ /// Lower limit of the required flow [m3/h]
+ /// Higher limit of the required flow [m3/h]
+ /// Measured flow [m3/h]
+ /// Timeout in [s]
+ /// SetFlowOp instance
+ public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, double requiredFlowLo, double requiredFlowHi,
+ DoubleBox measuredFlow, int timeout, float filterConstant)
+ {
+ return new SetFlowOp(UniCB, this, flowMeter, requiredFlowLo, requiredFlowHi, measuredFlow, timeout, 0, true);
+ }
+
+ ///
+ /// Operation to set the regulation valve to a required position
+ /// Events: Event.None
+ ///
+ /// Lower limit of the required valve position in [%]
+ /// Higher limit of the required valve position in [%]
+ /// SetPositionOp instance
+ public IOperation SetRegValvePositionOp(double pctLo, double pctHi, int timeoutMs)
+ {
+ return new SetRegValvePositionOp(UniCB, this, pctLo, pctHi, timeoutMs);
+ }
+
+ public IOperation ChangeRegValvePositionOp(double timePulseSec)
+ {
+ return new ChangeRegValvePositionOp(UniCB, this, timePulseSec);
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs
new file mode 100644
index 000000000..9b24c1b3f
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfg.cs
@@ -0,0 +1,108 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml.Serialization;
+using Config.Entities;
+using SchematicDrawing;
+using TBF.Rig.Generic;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public class RegValveCfg : ComponentCfgBase, IChildComponentCfg, IDrawingItemWithSetpoint
+ {
+ public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegValveCfg) })[0];
+ public override XmlSerializer GetSerializer() { return Serializer; }
+
+ public IComponentCfgCtrl GetControl(IList cmpntEntities)
+ {
+ return new RegValveCfgCtrl();
+ }
+
+ ///
+ /// Serialized parameters
+ ///
+ public int Idx1; /// 1..8
+ public ValveCategory Category; /// Feeding, Output or All
+ public int AdcValueClosed; /// 0..1023
+ public int AdcValueOpen; /// 0..1023
+ public int StableTimeMs; /// 200..1500 ms, step is 50 ms
+ public int FlowStableSec; /// 0..60 sec
+ public bool StoredPositionReuse; /// true = store and re-use previous regulation valve positions
+ public int RegulationMinStep { get; set; } /// low regulation saturation time ...0=0, 1=50, 2=100, 3=150, 4=200, 5=250, 6=300 [ms]
+ public string SetpFormat { get; set; }
+ public Common.Unit SetpUnit { get; set; }
+
+ /// Schematic drawing info
+ public Shape Shape { get; set; }
+ public int X { get; set; }
+ public int Y { get; set; }
+ public Sz Sz { get; set; }
+ public Orient Orient { get; set; }
+ public bool Flip { get; set; }
+ public int LblX { get; set; }
+ public int LblY { get; set; }
+ public Orient LblOrient { get; set; }
+ public int SetpX { get; set; }
+ public int SetpY { get; set; }
+ public Orient SetpOrient { get; set; }
+
+ [XmlIgnore]
+ public IList GNodes { get; set; }
+
+ ///
+ /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec.
+ ///
+ public int StableTime { get { return (StableTimeMs - 200) / 50; } }
+
+ /// Private parameterless constructor invoked by all other (public) constructors
+ RegValveCfg()
+ {
+ GNodes = new List();
+ }
+
+ public RegValveCfg(string name, IComponentFactory factory)
+ : this()
+ {
+ Shape = Shape.RegV;
+ Sz = Sz.M;
+ SetpFormat = "{0:F0} %";
+ SetpUnit = Common.Unit.Pct;
+
+ Name = name;
+ Factory = factory;
+ ParentName = "UniCB";
+ Category = ValveCategory.Output;
+ Idx1 = 1;
+ AdcValueClosed = 100;
+ AdcValueOpen = 500;
+ StableTimeMs = 500;
+ FlowStableSec = 5;
+ StoredPositionReuse = false;
+ RegulationMinStep = 0;
+
+ LblX = 38;
+ SetpX = 38;
+ SetpY = 22;
+ }
+
+
+
+ public string ToString(int i)
+ {
+ return string.Format("Name={0} ({1}), Idx1={2}, Cat.={3}, ADC-Closed={4}, ADC-Open={5}, StabTm={6}ms, FlowStable={7}s, PosReuse={8}",
+ Name,
+ (string.IsNullOrEmpty(ParentName) ? "-" : ParentName),
+ Idx1,
+ Category,
+ AdcValueClosed,
+ AdcValueOpen,
+ StableTimeMs,
+ FlowStableSec,
+ StoredPositionReuse,
+ RegulationMinStep);
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs
new file mode 100644
index 000000000..98e37457a
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.cs
@@ -0,0 +1,394 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+using System.Linq;
+using System.Windows.Forms;
+using log4net;
+using Common;
+using Config.Entities;
+using TBF.Rig.Generic;
+using TBF.UI.Bench.Components;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public partial class RegValveCfgCtrl : UserControl, IComponentCfgCtrl
+ {
+ static readonly ILog log = LogManager.GetLogger(typeof(RegValveCfgCtrl));
+
+ ComponentParametersDlg parent;
+
+ public bool ShowMore { get { return true; } }
+
+ RegValveCfg config;
+ public IComponentCfg Config
+ {
+ get { return config as IComponentCfg; }
+ set
+ {
+ config = value as RegValveCfg;
+ Redraw();
+ }
+ }
+
+ public RegValveCfgCtrl()
+ {
+ InitializeComponent();
+ }
+
+ private void RegulationValveCfgCtrl_Load(object sender, EventArgs e)
+ {
+ parent = ParentForm as ComponentParametersDlg;
+ if (parent == null) return;
+
+ if (parent.CmpntEntities != null)
+ {
+ foreach (var c in parent.CmpntEntities.Where(x => x.ClassName == "ControlBoard.Uni"))
+ {
+ parentNameComboBox.Items.Add(c.Name);
+ }
+ }
+
+ categoryComboBox.Items.Add(ValveCategory.Feeding.ToString());
+ categoryComboBox.Items.Add(ValveCategory.Output.ToString());
+
+ if (config != null)
+ {
+ adc1 = config.AdcValueClosed;
+ pct1 = 0;
+ adc2 = config.AdcValueOpen;
+ pct2 = 100;
+ }
+
+ for (Common.Unit units = 0; units < global::Common.Unit.Count; units++)
+ {
+ if (global::Common.Units.IsQuantity(units, Quantity.Error))
+ {
+ unitsComboBox.Items.Add(units.ToString());
+ }
+ }
+
+ regulMinStepsComboBox.Items.Add("0");
+ regulMinStepsComboBox.Items.Add("50");
+ regulMinStepsComboBox.Items.Add("100");
+ regulMinStepsComboBox.Items.Add("150");
+ regulMinStepsComboBox.Items.Add("200");
+ regulMinStepsComboBox.Items.Add("250");
+ regulMinStepsComboBox.Items.Add("300");
+
+ Redraw();
+ StartResponseHandler();
+ }
+
+ public void Closing()
+ {
+ StopResponseHandler();
+ }
+
+ void Redraw()
+ {
+ if (config == null) return; /// Control was not loaded, settings were not changed
+
+ classNameLabel.Text = config.Factory.ClassName;
+ nameTextBox.Text = config.Name;
+ parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName;
+ categoryComboBox.Text = config.Category.ToString();
+ positionTextBox.Text = config.Idx1.ToString();
+ adcClosedTextBox.Text = config.AdcValueClosed.ToString();
+ adcOpenTextBox.Text = config.AdcValueOpen.ToString();
+ stableTimeTextBox.Text = config.StableTimeMs.ToString();
+ flowStableSecTextBox.Text = config.FlowStableSec.ToString();
+ storedPosReuseCheckBox.Checked = config.StoredPositionReuse;
+ formatTextBox.Text = config.SetpFormat;
+ unitsComboBox.Text = config.SetpUnit.ToString();
+ regulMinStepsComboBox.Text = (config.RegulationMinStep * 50).ToString();
+
+ adcTextBox1.Text = adc1.ToString();
+ adcTextBox2.Text = adc2.ToString();
+ pctTextBox1.Text = pct1.ToString();
+ pctTextBox2.Text = pct2.ToString();
+ }
+
+ public void Unlock()
+ {
+ nameTextBox.Enabled = true;
+ parentNameComboBox.Enabled = true;
+ categoryComboBox.Enabled = true;
+ positionTextBox.Enabled = true;
+ adcClosedTextBox.Enabled = true;
+ adcOpenTextBox.Enabled = true;
+ stableTimeTextBox.Enabled = true;
+ flowStableSecTextBox.Enabled = true;
+ storedPosReuseCheckBox.Enabled = true;
+ formatTextBox.Enabled = true;
+ unitsComboBox.Enabled = true;
+ regulMinStepsComboBox.Enabled = true;
+ }
+
+ public CfgUpdateFlags VerifyCfg(ref string message)
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ int dummy;
+ if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid 'Parent Name'";
+ }
+
+ if (!categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString()) &&
+ !categoryComboBox.Text.Equals(ValveCategory.Output.ToString()))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid 'Category'";
+ }
+
+ if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 1 || dummy > 8)
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "'Position' should be between 1 and 8";
+ }
+
+ if (!int.TryParse(adcClosedTextBox.Text, out dummy) || dummy < 0 || dummy > 1023)
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "'ADC when Closed' should be between 0 and 1023";
+ }
+
+ if (!int.TryParse(adcOpenTextBox.Text, out dummy) || dummy < 0 || dummy > 1023)
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "'ADC when Open' should be between 0 and 1023";
+ }
+
+ if (!int.TryParse(stableTimeTextBox.Text, out dummy) || dummy < 200 || dummy > 1500 || (dummy % 50) != 0)
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "'Stable time' should be between 200 and 1500 ms in 50 ms steps";
+ }
+
+ if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60)
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "'Flow stable' should be between 0 and 60 sec";
+ }
+
+ if (!unitsComboBox.Items.Contains(unitsComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid 'Units'";
+ }
+
+ return flags;
+ }
+
+ public CfgUpdateFlags UpdateCfg()
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
+ ///
+ if (!config.Name.Equals(nameTextBox.Text))
+ {
+ config.Name = nameTextBox.Text;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ string parentname = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text;
+ if (!config.ParentName.Equals(parentname))
+ {
+ config.ParentName = parentname;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ ValveCategory newCategory;
+ if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding;
+ else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output;
+ else newCategory = ValveCategory.None;
+ if (newCategory != config.Category)
+ {
+ config.Category = newCategory;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ int tmp = int.Parse(positionTextBox.Text);
+ if (config.Idx1 != tmp)
+ {
+ config.Idx1 = tmp;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ tmp = int.Parse(adcClosedTextBox.Text);
+ if (config.AdcValueClosed != tmp)
+ {
+ config.AdcValueClosed = tmp;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ tmp = int.Parse(adcOpenTextBox.Text);
+ if (config.AdcValueOpen != tmp)
+ {
+ config.AdcValueOpen = tmp;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ tmp = int.Parse(stableTimeTextBox.Text);
+ if (config.StableTimeMs != tmp)
+ {
+ config.StableTimeMs = tmp;
+ flags |= CfgUpdateFlags.AnyChange;
+ }
+
+ tmp = int.Parse(flowStableSecTextBox.Text);
+ if (config.FlowStableSec != tmp)
+ {
+ config.FlowStableSec = tmp;
+ flags |= CfgUpdateFlags.AnyChange;
+ }
+
+ tmp = regulMinStepsComboBox.SelectedIndex;
+ if (config.RegulationMinStep != tmp)
+ {
+ config.RegulationMinStep = tmp;
+ flags |= CfgUpdateFlags.AnyChange;
+ }
+
+ bool btmp = storedPosReuseCheckBox.Checked;
+ if (config.StoredPositionReuse != btmp)
+ {
+ config.StoredPositionReuse = btmp;
+ flags |= CfgUpdateFlags.RestartRqrd;
+ }
+
+ if ((flags & CfgUpdateFlags.AnyChange) != 0)
+ {
+ RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config));
+ }
+
+ config.SetpFormat = formatTextBox.Text;
+ config.SetpUnit = global::Common.Unit.None;
+ for (Common.Unit units = 0; units < global::Common.Unit.Count; units++)
+ {
+ if (unitsComboBox.Text == units.ToString())
+ {
+ config.SetpUnit = units;
+ break;
+ }
+ }
+
+ return flags;
+ }
+
+ int adc1;
+ int pct1;
+
+ int adc2;
+ int pct2;
+
+ private void openButton_Click(object sender, EventArgs e)
+ {
+ RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.RVOpenStep, config));
+ }
+
+ private void closeButton_Click(object sender, EventArgs e)
+ {
+ RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.RVCloseStep, config));
+ }
+
+ //
+ private void getButton1_Click(object sender, EventArgs e)
+ {
+ RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc1, config));
+ }
+
+ private void getButton2_Click(object sender, EventArgs e)
+ {
+ RegValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc2, config));
+ }
+
+ private void setButton_Click(object sender, EventArgs e)
+ {
+ int tmpPct1;
+ int tmpPct2;
+ if ((int.TryParse(pctTextBox1.Text, out tmpPct1) && (tmpPct1 >= 0) && (tmpPct1 <= 100)) &&
+ (int.TryParse(pctTextBox2.Text, out tmpPct2) && (tmpPct2 >= 0) && (tmpPct2 <= 100)))
+ {
+ pct1 = tmpPct1;
+ pct2 = tmpPct2;
+ UpdateValveOpenClose();
+ }
+ }
+
+ void UpdateValveOpenClose()
+ {
+ if ((adc1 == adc2) || (pct1 == pct2)) return;
+
+ double factor = (float)(adc2 - adc1) / (float)(pct2 - pct1);
+ int adcClosed = (int)((float)(0 - pct1) * factor + (float)adc1 + 0.5f);
+ int adcOpen = (int)((float)(100 - pct1) * factor + (float)adc1 + 0.5f);
+
+ if ((adcClosed >= 0) && (adcOpen >= 0))
+ {
+ adcClosedTextBox.Text = adcClosed.ToString();
+ adcOpenTextBox.Text = adcOpen.ToString();
+ }
+ }
+
+ private void regulMinStepsComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (regulMinStepsComboBox.SelectedItem != null)
+ {
+ //config.RegulationMinStep = regulMinStepsComboBox.SelectedIndex;
+ }
+ }
+ #region Configuration Change Handling
+
+ public static void OnCmdResponse(object sender, CmdResponseArgs args)
+ {
+ if (CmdResponseHandler == null) return;
+ try { CmdResponseHandler(sender, args); }
+ catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CmdResponseHandler;
+
+ public void StartResponseHandler()
+ {
+ Handlers.AdcChangedHandler += delegate(object sndr, CmdResponseArgs args)
+ {
+ if (InvokeRequired) { Invoke(new EventHandler(OnAdcChanged), sndr, args); }
+ else OnAdcChanged(sndr, args);
+ };
+
+ CmdResponseHandler += delegate(object sender, CmdResponseArgs args)
+ {
+ if (args.Command == CfgChangeCmd.GetAdc1)
+ {
+ adc1 = args.Response;
+ adcTextBox1.Text = adc1.ToString();
+ }
+ else if (args.Command == CfgChangeCmd.GetAdc2)
+ {
+ adc2 = args.Response;
+ adcTextBox2.Text = adc2.ToString();
+ }
+ };
+ }
+
+ public void StopResponseHandler()
+ {
+ CmdResponseHandler = null;
+ }
+
+ void OnAdcChanged(object sender, CmdResponseArgs data)
+ {
+ if (data.Command == CfgChangeCmd.GetAdc && data.Id == config.Idx1)
+ {
+ adcTextBox.Text = data.Response.ToString();
+ }
+ }
+
+ #endregion Configuration Change Handling
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs
new file mode 100644
index 000000000..2b24c92ce
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.designer.cs
@@ -0,0 +1,581 @@
+///
+/// Copyright (c) 2021 Sensus Metering Systems
+///
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ partial class RegValveCfgCtrl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.positionTextBox = new System.Windows.Forms.TextBox();
+ this.positionLabel = new System.Windows.Forms.Label();
+ this.parentNameLabel = new System.Windows.Forms.Label();
+ this.nameTextBox = new System.Windows.Forms.TextBox();
+ this.nameLabel = new System.Windows.Forms.Label();
+ this.classNameLabel = new System.Windows.Forms.Label();
+ this.adcClosedLabel = new System.Windows.Forms.Label();
+ this.adcClosedTextBox = new System.Windows.Forms.TextBox();
+ this.adcOpenTextBox = new System.Windows.Forms.TextBox();
+ this.adcOpenLabel = new System.Windows.Forms.Label();
+ this.parentNameComboBox = new System.Windows.Forms.ComboBox();
+ this.storedPosReuseCheckBox = new System.Windows.Forms.CheckBox();
+ this.stableTimeTextBox = new System.Windows.Forms.TextBox();
+ this.stableTimeLabel = new System.Windows.Forms.Label();
+ this.flowStableSecTextBox = new System.Windows.Forms.TextBox();
+ this.flowStableSecLabel = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.setButton1 = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.ADC = new System.Windows.Forms.Label();
+ this.getButton1 = new System.Windows.Forms.Button();
+ this.pctTextBox1 = new System.Windows.Forms.TextBox();
+ this.adcTextBox1 = new System.Windows.Forms.TextBox();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.setButton2 = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.getButton2 = new System.Windows.Forms.Button();
+ this.pctTextBox2 = new System.Windows.Forms.TextBox();
+ this.adcTextBox2 = new System.Windows.Forms.TextBox();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.closeButton = new System.Windows.Forms.Button();
+ this.openButton = new System.Windows.Forms.Button();
+ this.adcTextBox = new System.Windows.Forms.TextBox();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.categoryComboBox = new System.Windows.Forms.ComboBox();
+ this.categoryLabel = new System.Windows.Forms.Label();
+ this.unitsComboBox = new System.Windows.Forms.ComboBox();
+ this.unitsLabel = new System.Windows.Forms.Label();
+ this.formatTextBox = new System.Windows.Forms.TextBox();
+ this.formatLabel = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.regulMinStepsComboBox = new System.Windows.Forms.ComboBox();
+ this.groupBox1.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.groupBox4.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // positionTextBox
+ //
+ this.positionTextBox.Enabled = false;
+ this.positionTextBox.Location = new System.Drawing.Point(138, 114);
+ this.positionTextBox.Name = "positionTextBox";
+ this.positionTextBox.Size = new System.Drawing.Size(46, 20);
+ this.positionTextBox.TabIndex = 8;
+ //
+ // positionLabel
+ //
+ this.positionLabel.AutoSize = true;
+ this.positionLabel.Location = new System.Drawing.Point(28, 117);
+ this.positionLabel.Name = "positionLabel";
+ this.positionLabel.Size = new System.Drawing.Size(18, 13);
+ this.positionLabel.TabIndex = 7;
+ this.positionLabel.Text = "ID";
+ //
+ // parentNameLabel
+ //
+ this.parentNameLabel.AutoSize = true;
+ this.parentNameLabel.Location = new System.Drawing.Point(28, 68);
+ this.parentNameLabel.Name = "parentNameLabel";
+ this.parentNameLabel.Size = new System.Drawing.Size(69, 13);
+ this.parentNameLabel.TabIndex = 3;
+ this.parentNameLabel.Text = "Parent Name";
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Enabled = false;
+ this.nameTextBox.Location = new System.Drawing.Point(138, 41);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.Size = new System.Drawing.Size(130, 20);
+ this.nameTextBox.TabIndex = 2;
+ //
+ // nameLabel
+ //
+ this.nameLabel.AutoSize = true;
+ this.nameLabel.Location = new System.Drawing.Point(28, 44);
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Size = new System.Drawing.Size(35, 13);
+ this.nameLabel.TabIndex = 1;
+ this.nameLabel.Text = "Name";
+ //
+ // classNameLabel
+ //
+ this.classNameLabel.AutoSize = true;
+ this.classNameLabel.Location = new System.Drawing.Point(135, 14);
+ this.classNameLabel.Name = "classNameLabel";
+ this.classNameLabel.Size = new System.Drawing.Size(89, 13);
+ this.classNameLabel.TabIndex = 0;
+ this.classNameLabel.Text = "ComponentName";
+ //
+ // adcClosedLabel
+ //
+ this.adcClosedLabel.AutoSize = true;
+ this.adcClosedLabel.Location = new System.Drawing.Point(28, 141);
+ this.adcClosedLabel.Name = "adcClosedLabel";
+ this.adcClosedLabel.Size = new System.Drawing.Size(93, 13);
+ this.adcClosedLabel.TabIndex = 9;
+ this.adcClosedLabel.Text = "ADC when Closed";
+ //
+ // adcClosedTextBox
+ //
+ this.adcClosedTextBox.Enabled = false;
+ this.adcClosedTextBox.Location = new System.Drawing.Point(138, 138);
+ this.adcClosedTextBox.Name = "adcClosedTextBox";
+ this.adcClosedTextBox.Size = new System.Drawing.Size(46, 20);
+ this.adcClosedTextBox.TabIndex = 10;
+ //
+ // adcOpenTextBox
+ //
+ this.adcOpenTextBox.Enabled = false;
+ this.adcOpenTextBox.Location = new System.Drawing.Point(138, 162);
+ this.adcOpenTextBox.Name = "adcOpenTextBox";
+ this.adcOpenTextBox.Size = new System.Drawing.Size(46, 20);
+ this.adcOpenTextBox.TabIndex = 12;
+ //
+ // adcOpenLabel
+ //
+ this.adcOpenLabel.AutoSize = true;
+ this.adcOpenLabel.Location = new System.Drawing.Point(28, 165);
+ this.adcOpenLabel.Name = "adcOpenLabel";
+ this.adcOpenLabel.Size = new System.Drawing.Size(87, 13);
+ this.adcOpenLabel.TabIndex = 11;
+ this.adcOpenLabel.Text = "ADC when Open";
+ //
+ // parentNameComboBox
+ //
+ this.parentNameComboBox.Enabled = false;
+ this.parentNameComboBox.FormattingEnabled = true;
+ this.parentNameComboBox.Location = new System.Drawing.Point(138, 65);
+ this.parentNameComboBox.Name = "parentNameComboBox";
+ this.parentNameComboBox.Size = new System.Drawing.Size(130, 21);
+ this.parentNameComboBox.TabIndex = 4;
+ //
+ // storedPosReuseCheckBox
+ //
+ this.storedPosReuseCheckBox.AutoSize = true;
+ this.storedPosReuseCheckBox.Enabled = false;
+ this.storedPosReuseCheckBox.Location = new System.Drawing.Point(31, 262);
+ this.storedPosReuseCheckBox.Name = "storedPosReuseCheckBox";
+ this.storedPosReuseCheckBox.Size = new System.Drawing.Size(162, 17);
+ this.storedPosReuseCheckBox.TabIndex = 17;
+ this.storedPosReuseCheckBox.Text = "Enable stored position re-use";
+ this.storedPosReuseCheckBox.UseVisualStyleBackColor = true;
+ //
+ // stableTimeTextBox
+ //
+ this.stableTimeTextBox.Enabled = false;
+ this.stableTimeTextBox.Location = new System.Drawing.Point(138, 186);
+ this.stableTimeTextBox.Name = "stableTimeTextBox";
+ this.stableTimeTextBox.Size = new System.Drawing.Size(46, 20);
+ this.stableTimeTextBox.TabIndex = 14;
+ //
+ // stableTimeLabel
+ //
+ this.stableTimeLabel.AutoSize = true;
+ this.stableTimeLabel.Location = new System.Drawing.Point(28, 189);
+ this.stableTimeLabel.Name = "stableTimeLabel";
+ this.stableTimeLabel.Size = new System.Drawing.Size(81, 13);
+ this.stableTimeLabel.TabIndex = 13;
+ this.stableTimeLabel.Text = "Stable time [ms]";
+ //
+ // flowStableSecTextBox
+ //
+ this.flowStableSecTextBox.Enabled = false;
+ this.flowStableSecTextBox.Location = new System.Drawing.Point(138, 210);
+ this.flowStableSecTextBox.Name = "flowStableSecTextBox";
+ this.flowStableSecTextBox.Size = new System.Drawing.Size(46, 20);
+ this.flowStableSecTextBox.TabIndex = 16;
+ //
+ // flowStableSecLabel
+ //
+ this.flowStableSecLabel.AutoSize = true;
+ this.flowStableSecLabel.Location = new System.Drawing.Point(28, 213);
+ this.flowStableSecLabel.Name = "flowStableSecLabel";
+ this.flowStableSecLabel.Size = new System.Drawing.Size(74, 13);
+ this.flowStableSecLabel.TabIndex = 15;
+ this.flowStableSecLabel.Text = "Flow stable [s]";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.setButton1);
+ this.groupBox1.Controls.Add(this.label1);
+ this.groupBox1.Controls.Add(this.ADC);
+ this.groupBox1.Controls.Add(this.getButton1);
+ this.groupBox1.Controls.Add(this.pctTextBox1);
+ this.groupBox1.Controls.Add(this.adcTextBox1);
+ this.groupBox1.Location = new System.Drawing.Point(10, 398);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(280, 59);
+ this.groupBox1.TabIndex = 19;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Measured value 1";
+ //
+ // setButton1
+ //
+ this.setButton1.Location = new System.Drawing.Point(229, 17);
+ this.setButton1.Name = "setButton1";
+ this.setButton1.Size = new System.Drawing.Size(38, 33);
+ this.setButton1.TabIndex = 5;
+ this.setButton1.Text = "Set";
+ this.setButton1.UseVisualStyleBackColor = true;
+ this.setButton1.Click += new System.EventHandler(this.setButton_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(209, 28);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(15, 13);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "%";
+ //
+ // ADC
+ //
+ this.ADC.AutoSize = true;
+ this.ADC.Location = new System.Drawing.Point(11, 28);
+ this.ADC.Name = "ADC";
+ this.ADC.Size = new System.Drawing.Size(32, 13);
+ this.ADC.TabIndex = 3;
+ this.ADC.Text = "ADC:";
+ //
+ // getButton1
+ //
+ this.getButton1.Location = new System.Drawing.Point(101, 18);
+ this.getButton1.Name = "getButton1";
+ this.getButton1.Size = new System.Drawing.Size(38, 33);
+ this.getButton1.TabIndex = 2;
+ this.getButton1.Text = "Get";
+ this.getButton1.UseVisualStyleBackColor = true;
+ this.getButton1.Click += new System.EventHandler(this.getButton1_Click);
+ //
+ // pctTextBox1
+ //
+ this.pctTextBox1.Location = new System.Drawing.Point(160, 24);
+ this.pctTextBox1.Name = "pctTextBox1";
+ this.pctTextBox1.Size = new System.Drawing.Size(46, 20);
+ this.pctTextBox1.TabIndex = 1;
+ //
+ // adcTextBox1
+ //
+ this.adcTextBox1.Location = new System.Drawing.Point(47, 24);
+ this.adcTextBox1.Name = "adcTextBox1";
+ this.adcTextBox1.Size = new System.Drawing.Size(44, 20);
+ this.adcTextBox1.TabIndex = 0;
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.setButton2);
+ this.groupBox2.Controls.Add(this.label2);
+ this.groupBox2.Controls.Add(this.label3);
+ this.groupBox2.Controls.Add(this.getButton2);
+ this.groupBox2.Controls.Add(this.pctTextBox2);
+ this.groupBox2.Controls.Add(this.adcTextBox2);
+ this.groupBox2.Location = new System.Drawing.Point(10, 462);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(280, 59);
+ this.groupBox2.TabIndex = 20;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Measured value 2";
+ //
+ // setButton2
+ //
+ this.setButton2.Location = new System.Drawing.Point(229, 17);
+ this.setButton2.Name = "setButton2";
+ this.setButton2.Size = new System.Drawing.Size(38, 33);
+ this.setButton2.TabIndex = 5;
+ this.setButton2.Text = "Set";
+ this.setButton2.UseVisualStyleBackColor = true;
+ this.setButton2.Click += new System.EventHandler(this.setButton_Click);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(209, 28);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(15, 13);
+ this.label2.TabIndex = 4;
+ this.label2.Text = "%";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(11, 27);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(32, 13);
+ this.label3.TabIndex = 3;
+ this.label3.Text = "ADC:";
+ //
+ // getButton2
+ //
+ this.getButton2.Location = new System.Drawing.Point(101, 18);
+ this.getButton2.Name = "getButton2";
+ this.getButton2.Size = new System.Drawing.Size(38, 33);
+ this.getButton2.TabIndex = 2;
+ this.getButton2.Text = "Get";
+ this.getButton2.UseVisualStyleBackColor = true;
+ this.getButton2.Click += new System.EventHandler(this.getButton2_Click);
+ //
+ // pctTextBox2
+ //
+ this.pctTextBox2.Location = new System.Drawing.Point(160, 24);
+ this.pctTextBox2.Name = "pctTextBox2";
+ this.pctTextBox2.Size = new System.Drawing.Size(46, 20);
+ this.pctTextBox2.TabIndex = 1;
+ //
+ // adcTextBox2
+ //
+ this.adcTextBox2.Location = new System.Drawing.Point(47, 24);
+ this.adcTextBox2.Name = "adcTextBox2";
+ this.adcTextBox2.Size = new System.Drawing.Size(44, 20);
+ this.adcTextBox2.TabIndex = 0;
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.closeButton);
+ this.groupBox3.Controls.Add(this.openButton);
+ this.groupBox3.Location = new System.Drawing.Point(10, 527);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(280, 60);
+ this.groupBox3.TabIndex = 21;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Regulation valve";
+ //
+ // closeButton
+ //
+ this.closeButton.Location = new System.Drawing.Point(14, 19);
+ this.closeButton.Name = "closeButton";
+ this.closeButton.Size = new System.Drawing.Size(107, 28);
+ this.closeButton.TabIndex = 1;
+ this.closeButton.Text = "Close";
+ this.closeButton.UseVisualStyleBackColor = true;
+ this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
+ //
+ // openButton
+ //
+ this.openButton.Location = new System.Drawing.Point(160, 19);
+ this.openButton.Name = "openButton";
+ this.openButton.Size = new System.Drawing.Size(107, 28);
+ this.openButton.TabIndex = 0;
+ this.openButton.Text = "Open";
+ this.openButton.UseVisualStyleBackColor = true;
+ this.openButton.Click += new System.EventHandler(this.openButton_Click);
+ //
+ // adcTextBox
+ //
+ this.adcTextBox.Location = new System.Drawing.Point(47, 14);
+ this.adcTextBox.Name = "adcTextBox";
+ this.adcTextBox.Size = new System.Drawing.Size(44, 20);
+ this.adcTextBox.TabIndex = 21;
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.label4);
+ this.groupBox4.Controls.Add(this.adcTextBox);
+ this.groupBox4.Location = new System.Drawing.Point(10, 352);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(279, 40);
+ this.groupBox4.TabIndex = 22;
+ this.groupBox4.TabStop = false;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(11, 17);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(32, 13);
+ this.label4.TabIndex = 22;
+ this.label4.Text = "ADC:";
+ //
+ // categoryComboBox
+ //
+ this.categoryComboBox.Enabled = false;
+ this.categoryComboBox.FormattingEnabled = true;
+ this.categoryComboBox.Location = new System.Drawing.Point(138, 90);
+ this.categoryComboBox.Name = "categoryComboBox";
+ this.categoryComboBox.Size = new System.Drawing.Size(130, 21);
+ this.categoryComboBox.TabIndex = 6;
+ //
+ // categoryLabel
+ //
+ this.categoryLabel.AutoSize = true;
+ this.categoryLabel.Location = new System.Drawing.Point(28, 93);
+ this.categoryLabel.Name = "categoryLabel";
+ this.categoryLabel.Size = new System.Drawing.Size(49, 13);
+ this.categoryLabel.TabIndex = 5;
+ this.categoryLabel.Text = "Category";
+ //
+ // unitsComboBox
+ //
+ this.unitsComboBox.Enabled = false;
+ this.unitsComboBox.FormattingEnabled = true;
+ this.unitsComboBox.Location = new System.Drawing.Point(138, 309);
+ this.unitsComboBox.Name = "unitsComboBox";
+ this.unitsComboBox.Size = new System.Drawing.Size(80, 21);
+ this.unitsComboBox.TabIndex = 32;
+ //
+ // unitsLabel
+ //
+ this.unitsLabel.AutoSize = true;
+ this.unitsLabel.Location = new System.Drawing.Point(28, 312);
+ this.unitsLabel.Name = "unitsLabel";
+ this.unitsLabel.Size = new System.Drawing.Size(78, 13);
+ this.unitsLabel.TabIndex = 31;
+ this.unitsLabel.Text = "Unit of setpoint";
+ //
+ // formatTextBox
+ //
+ this.formatTextBox.Enabled = false;
+ this.formatTextBox.Location = new System.Drawing.Point(138, 285);
+ this.formatTextBox.Name = "formatTextBox";
+ this.formatTextBox.Size = new System.Drawing.Size(130, 20);
+ this.formatTextBox.TabIndex = 30;
+ //
+ // formatLabel
+ //
+ this.formatLabel.AutoSize = true;
+ this.formatLabel.Location = new System.Drawing.Point(28, 288);
+ this.formatLabel.Name = "formatLabel";
+ this.formatLabel.Size = new System.Drawing.Size(78, 13);
+ this.formatLabel.TabIndex = 29;
+ this.formatLabel.Text = "Setpoint format";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(28, 239);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(110, 13);
+ this.label5.TabIndex = 33;
+ this.label5.Text = "Regul. min. steps [ms]";
+ //
+ // regulMinStepsComboBox
+ //
+ this.regulMinStepsComboBox.Enabled = false;
+ this.regulMinStepsComboBox.FormattingEnabled = true;
+ this.regulMinStepsComboBox.Location = new System.Drawing.Point(138, 236);
+ this.regulMinStepsComboBox.Name = "regulMinStepsComboBox";
+ this.regulMinStepsComboBox.Size = new System.Drawing.Size(80, 21);
+ this.regulMinStepsComboBox.TabIndex = 34;
+ this.regulMinStepsComboBox.SelectedIndexChanged += new System.EventHandler(this.regulMinStepsComboBox_SelectedIndexChanged);
+ //
+ // RegValveCfgCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.regulMinStepsComboBox);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.unitsComboBox);
+ this.Controls.Add(this.unitsLabel);
+ this.Controls.Add(this.formatTextBox);
+ this.Controls.Add(this.formatLabel);
+ this.Controls.Add(this.categoryComboBox);
+ this.Controls.Add(this.categoryLabel);
+ this.Controls.Add(this.groupBox4);
+ this.Controls.Add(this.groupBox3);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.flowStableSecTextBox);
+ this.Controls.Add(this.flowStableSecLabel);
+ this.Controls.Add(this.stableTimeTextBox);
+ this.Controls.Add(this.stableTimeLabel);
+ this.Controls.Add(this.storedPosReuseCheckBox);
+ this.Controls.Add(this.parentNameComboBox);
+ this.Controls.Add(this.adcOpenTextBox);
+ this.Controls.Add(this.adcOpenLabel);
+ this.Controls.Add(this.adcClosedTextBox);
+ this.Controls.Add(this.adcClosedLabel);
+ this.Controls.Add(this.positionTextBox);
+ this.Controls.Add(this.positionLabel);
+ this.Controls.Add(this.parentNameLabel);
+ this.Controls.Add(this.nameTextBox);
+ this.Controls.Add(this.nameLabel);
+ this.Controls.Add(this.classNameLabel);
+ this.Name = "RegValveCfgCtrl";
+ this.Size = new System.Drawing.Size(300, 700);
+ this.Load += new System.EventHandler(this.RegulationValveCfgCtrl_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox4.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox positionTextBox;
+ private System.Windows.Forms.Label positionLabel;
+ private System.Windows.Forms.Label parentNameLabel;
+ private System.Windows.Forms.TextBox nameTextBox;
+ private System.Windows.Forms.Label nameLabel;
+ private System.Windows.Forms.Label classNameLabel;
+ private System.Windows.Forms.Label adcClosedLabel;
+ private System.Windows.Forms.TextBox adcClosedTextBox;
+ private System.Windows.Forms.TextBox adcOpenTextBox;
+ private System.Windows.Forms.Label adcOpenLabel;
+ private System.Windows.Forms.ComboBox parentNameComboBox;
+ private System.Windows.Forms.CheckBox storedPosReuseCheckBox;
+ private System.Windows.Forms.TextBox stableTimeTextBox;
+ private System.Windows.Forms.Label stableTimeLabel;
+ private System.Windows.Forms.TextBox flowStableSecTextBox;
+ private System.Windows.Forms.Label flowStableSecLabel;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button setButton1;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label ADC;
+ private System.Windows.Forms.Button getButton1;
+ private System.Windows.Forms.TextBox pctTextBox1;
+ private System.Windows.Forms.TextBox adcTextBox1;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.Button setButton2;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button getButton2;
+ private System.Windows.Forms.TextBox pctTextBox2;
+ private System.Windows.Forms.TextBox adcTextBox2;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.Button closeButton;
+ private System.Windows.Forms.Button openButton;
+ private System.Windows.Forms.TextBox adcTextBox;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.ComboBox categoryComboBox;
+ private System.Windows.Forms.Label categoryLabel;
+ private System.Windows.Forms.ComboBox unitsComboBox;
+ private System.Windows.Forms.Label unitsLabel;
+ private System.Windows.Forms.TextBox formatTextBox;
+ private System.Windows.Forms.Label formatLabel;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.ComboBox regulMinStepsComboBox;
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/RegValveCfgCtrl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs
new file mode 100644
index 000000000..8eb540601
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetFlowOp.cs
@@ -0,0 +1,340 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using Common;
+using log4net;
+using Config.Entities;
+using TBF.Rig.ControlBoard.Uni;
+using TBF.Rig.GenericDevices;
+using TBF.Boxes;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public class SetFlowOp : IOperation
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(SetFlowOp));
+ public override string ToString()
+ {
+ return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2})", regV.Name, shrinkedTgtFlowLo, shrinkedTgtFlowHi);
+ }
+
+ public const double RqrdFlowRangeRatio = 0.5;
+
+ ///
+ /// Set by the constructor
+ ///
+ readonly UniCB uniCB;
+ readonly RegValve regV;
+ readonly IFlowMeter flowMeter;
+ readonly double shrinkedTgtFlowLo;
+ readonly double shrinkedTgtFlowHi;
+ readonly double targetFlowAve;
+ readonly int timeout;
+ readonly int delay;
+ readonly bool leaveFlowControlRunning;
+
+ readonly double maximalFlow;
+
+ ///
+ /// Internal state of this operation
+ ///
+ enum OpState
+ {
+ Idle = 0,
+ ValveMoveToPosition1, /// Wait 1 takt
+ ValveMoveToPosition2, /// This is actual move to position
+ ValveMoveToPosition3, /// Wait 1 takt
+ SettingPosition,
+ Wait4FlowMsrmntAndSendRVMove, /// Wait until the flow measurement starts, then issue reg. valve move command
+ SettingFlow, /// Measure the flow and verify whether it is within limits sufficiently long time
+ FlowReached,
+ SendCommandAgain,
+ }
+ OpState opState;
+
+ double currentReqFlowLo;
+ double currentReqFlowHi;
+ double targetPositionLo;
+ double targetPositionHi;
+
+ int setFlowTime;
+ int expireTime;
+ DoubleBox msrdFlow;
+ int isFlowOkDuration;
+
+
+ ///
+ /// Set required water flow. Conditionally leave the measurement running.
+ /// Events: FlowSet, FlowTimeOut
+ ///
+ /// Control board device
+ /// Regulation valve component
+ /// Flowmeter component
+ /// Lower limit of the flow to be achieved in [m3/h]
+ /// Upper limit of the flow to be achieved in [m3/h]
+ /// DoubleBox for measured flow
+ /// Timeout for the flow setting in [s]
+ /// Flow setting starts after this delay in [s]
+ /// true = Leave the measurement running after op. stop
+ /// Only Elde.Valve flow are used, other flow on the lists are ignored
+ public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox msrdFlow,
+ int timeout, int delay, bool leaveFlowControlRunning)
+ {
+ this.uniCB = uniCB;
+ if (this.uniCB == null) throw new ArgumentNullException("Control board is null or not Uni");
+
+ this.regV = regValve as RegValve;
+ if (this.regV == null) throw new ArgumentNullException(string.Format("{0} is not Uni.RegValve", regValve.Name));
+
+ this.flowMeter = flowMeter;
+ if (this.flowMeter == null) throw new ArgumentNullException("flowMeter");
+
+ maximalFlow = flowMeter.NominalFlow * 1.25;
+
+ double rqrdFlowLoBeforeCorr = qFrom - MeasurementCorrection.GetCorrection(qFrom, flowMeter.Corrections);
+ double rqrdFlowHiBeforeCorr = qTo - MeasurementCorrection.GetCorrection(qTo, flowMeter.Corrections);
+ targetFlowAve = (rqrdFlowLoBeforeCorr + rqrdFlowHiBeforeCorr) / 2;
+ shrinkedTgtFlowLo = (RqrdFlowRangeRatio * rqrdFlowLoBeforeCorr)
+ + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the lower limit 15% of the range up
+ shrinkedTgtFlowHi = (RqrdFlowRangeRatio * rqrdFlowHiBeforeCorr)
+ + ((1 - RqrdFlowRangeRatio) * targetFlowAve); /// Move the upper limit 15% of the range down
+
+ this.msrdFlow = msrdFlow;
+ this.timeout = timeout;
+ this.delay = delay;
+ this.leaveFlowControlRunning = leaveFlowControlRunning;
+
+ log.Debug(this.ToString());
+ }
+
+ ///
+ /// Set required water flow - Do not leave the measurement running.
+ /// Events: FlowSet
+ ///
+ public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowbox, int timeout, int delay)
+ : this(uniCB, regValve, flowMeter, qFrom, qTo, flowbox, timeout, delay, false)
+ {
+ }
+
+ ///
+ /// Set required water flow - Do not leave the measurement running.
+ /// Events: FlowSet
+ ///
+ public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowbox, int timeout)
+ : this(uniCB, regValve, flowMeter, qFrom, qTo, flowbox, timeout, 0, false)
+ {
+ }
+
+ ///
+ /// Set required water flow - No timeout.
+ /// Events: FlowSet
+ ///
+ public SetFlowOp(UniCB uniCB, IRegValve regValve, IFlowMeter flowMeter, double qFrom, double qTo, DoubleBox flowbox)
+ : this(uniCB, regValve, flowMeter, qFrom, qTo, flowbox, int.MaxValue, 0, false)
+ {
+ }
+
+ ///
+ /// Fetch target position limits from the dictionary or return false
+ ///
+ /// Average of the flow targer range (input)
+ /// Target valve position low limit (output)
+ /// Target valve position high limit (output)
+ /// true when positions for the target flow are stored in the memory, otherwise return false
+ bool FetchTargetPosition(double avgReqFlow, out double positionLo, out double positionHi)
+ {
+ double targetPosition;
+ if (regV.Dict.TryGetValue(avgReqFlow, out targetPosition))
+ {
+ positionLo = Math.Max(targetPosition * 0.95, 0.0);
+ positionHi = Math.Min(targetPosition * 1.05, 100.0);
+ return true;
+ }
+ else
+ {
+ positionLo = 0;
+ positionHi = 0;
+ return false;
+ }
+ }
+
+ void StoreTargetPosition(double avgReqFlow, double actPosition)
+ {
+ if (!regV.Dict.ContainsKey(targetFlowAve))
+ {
+ regV.Dict.Add(new KeyValuePair(avgReqFlow, actPosition));
+ }
+ return;
+ }
+
+ /// Start this operation
+ public void Start()
+ {
+ log.InfoFormat("SetFlowOp:Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}",
+ regV.Idx1, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi);
+
+ /// Store the current time, etc.
+ setFlowTime = StateMachine.Time + delay;
+ expireTime = StateMachine.Time + timeout;
+ if (expireTime < 0) expireTime = int.MaxValue;
+
+ isFlowOkDuration = 0;
+
+ /// Start the flow measurement
+ uniCB.MeasureFlow(false, flowMeter.Idx1);
+
+ opState = OpState.Wait4FlowMsrmntAndSendRVMove;
+ }
+
+ ///
+ /// Run this operation
+ ///
+ ///
+ /// Event.OpArgumentError
+ /// Event.Starting
+ /// Event.Busy
+ /// Event.FlowReached
+ /// Event.RegulValveTimeOut
+ ///
+ public Event Run()
+ {
+ log.DebugFormat("Op.Run() opState={0}", opState);
+
+ if (StateMachine.Time > expireTime) return Event.RegulValveTimeOut;
+
+ if (opState == OpState.Wait4FlowMsrmntAndSendRVMove)
+ {
+ if (flowMeter.DebugLevel == DebugMode.Simulate) return Event.FlowReached;
+
+ if (!flowMeter.MsrmntAvailable) return Event.Starting;
+
+ double flow1 = flowMeter.ReadFlow();
+
+ /// Set the targer flow/frequency range
+ currentReqFlowLo = shrinkedTgtFlowLo; /// Default lower limit
+ currentReqFlowHi = shrinkedTgtFlowHi; /// Default upper limit
+ //if (flow1 >= targetFlowAve) currentReqFlowHi = targetFlowAve; /// Decrease upper limit
+ //if (flow1 <= targetFlowAve) currentReqFlowLo = targetFlowAve; /// Increase lower limit
+
+ if ((currentReqFlowLo >= currentReqFlowHi) || (currentReqFlowLo > maximalFlow) || (currentReqFlowHi <= 0))
+ {
+ return Event.OpArgumentError;
+ }
+
+ if (StateMachine.Time > setFlowTime)
+ {
+ uniCB.SetFlow(false, regV.Idx1, flowMeter.NominalFreq * currentReqFlowLo / flowMeter.NominalFlow,
+ flowMeter.NominalFreq * currentReqFlowHi / flowMeter.NominalFlow);
+
+ log.InfoFormat("Run(): rv#={0} TARGET: flowLo={1} flowHi={2}", regV.Idx1, currentReqFlowLo, currentReqFlowHi);
+
+ opState = OpState.SettingFlow;
+ }
+
+ return Event.Starting;
+ }
+
+ if (opState == OpState.ValveMoveToPosition1)
+ {
+ opState = OpState.ValveMoveToPosition2;
+ return Event.Starting;
+ }
+ else if (opState == OpState.ValveMoveToPosition2) /// Move to position
+ {
+ /// Issues the appropriate ValveMove(...) command
+ regV.MoveToPosition(false, targetPositionLo, targetPositionHi);
+
+ opState = OpState.SettingPosition;
+ return Event.Starting;
+ }
+ else if (opState == OpState.ValveMoveToPosition3)
+ {
+ opState = OpState.SettingPosition;
+ return Event.Starting;
+ }
+ else if (opState == OpState.SettingPosition)
+ {
+ /// Repeated untill position is reached
+ double rvPosition = regV.Position;
+ if ((targetPositionLo <= rvPosition) && (rvPosition <= targetPositionHi))
+ {
+ opState = OpState.Wait4FlowMsrmntAndSendRVMove;
+ }
+ return Event.Starting;
+ }
+ else if (opState == OpState.SettingFlow)
+ {
+ /// Regulation valve is setting flow to the required value
+ ///
+ double frequency = flowMeter.ReadFrequency();
+ double flow = flowMeter.ReadFlow();
+ if (msrdFlow != null && flow != 0) msrdFlow.Val = flow;
+
+ if (currentReqFlowLo <= flow && flow <= currentReqFlowHi)
+ {
+ isFlowOkDuration++; /// Increment the flow within range duration
+
+ if (isFlowOkDuration >= regV.FlowStableSec)
+ {
+ /// Flow is within range for sufficiently long time
+ if (regV.StoredPositionReuse)
+ {
+ double rvPosition = regV.Position; /// Read the current position
+ double storedPosition;
+ if (regV.Dict.TryGetValue(targetFlowAve, out storedPosition))
+ {
+ /// update the stored valve position
+ StoreTargetPosition(targetFlowAve, (rvPosition + storedPosition) / 2.0);
+ log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% stored={3} <--- Updating a stored position",
+ regV.Idx1, targetFlowAve, rvPosition.ToString("F1"), storedPosition);
+ }
+ else
+ {
+ /// store the valve position
+ StoreTargetPosition(targetFlowAve, rvPosition);
+ log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% <--- Storing a new position",
+ regV.Idx1, targetFlowAve, rvPosition.ToString("F1"));
+ }
+ }
+
+ log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow, currentReqFlowLo, currentReqFlowHi);
+
+ opState = OpState.FlowReached;
+ return Event.FlowReached;
+ }
+ else
+ {
+ log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, FLOW_OK_TIMER={3}s)", flow, currentReqFlowLo, currentReqFlowHi, isFlowOkDuration);
+ return Event.Busy;
+ }
+ }
+ else
+ {
+ /// Flow is out of range
+ isFlowOkDuration = 0;
+
+ log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2})", flow, currentReqFlowLo, currentReqFlowHi);
+ return Event.Busy;
+ }
+ }
+ else /// opState == OpState.FlowReached
+ {
+ log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flowMeter.ReadFlow(), currentReqFlowLo, currentReqFlowHi);
+ return Event.FlowReached;
+ }
+ }
+
+ /// Stop this operation
+ public void Stop()
+ {
+ if (!leaveFlowControlRunning)
+ {
+ uniCB.StopFlowControl(false, regV.Idx1); /// Stop the flow measurement
+ }
+
+ opState = OpState.Idle;
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs
new file mode 100644
index 000000000..071a9c163
--- /dev/null
+++ b/TBF/Rig/Uni/RegValveLowRegulTimeSaturation/SetRegValvePositionOp.cs
@@ -0,0 +1,155 @@
+///
+/// Copyright (c) 2021-2022 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using log4net;
+using TBF.Rig.ControlBoard.Uni;
+using TBF.Rig.GenericDevices;
+
+namespace TBF.Rig.Uni.RegValveLowRegulTimeSaturation
+{
+ public class SetRegValvePositionOp : IOperation
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(SetRegValvePositionOp));
+ public override string ToString()
+ {
+ return string.Format("SetRegValvePositionOp({0},{1},{2})", regV.Name, posLoPct, posHiPct);
+ }
+
+ ///
+ /// Internal states of this operation
+ ///
+ enum OpState
+ {
+ Idle = 0,
+ MoveToPosition, /// Send commend to move to position
+ CheckState, /// Check RV state by reading statos word
+ MovingToPosition, /// Command passed OK, RV is moving to a position
+ }
+ OpState opState;
+
+ /// Set by the constructor
+ readonly UniCB uniCB;
+ readonly RegValve regV;
+ readonly int regValveNr;
+ readonly double posLoPct;
+ readonly double posHiPct;
+ readonly int timeout;
+
+ /// Process values
+ int expireTime;
+ bool positionReached;
+
+ ///
+ /// Set required water flow.
+ /// Events: FlowSet, FlowTimeOut
+ ///
+ /// Control board device
+ /// Regulation valve component
+ /// Lower limit of the position to be achieved
+ /// Upper limit of the position to be achieved
+ /// Timeout in sec. for setting the flow
+ /// Only Elde.Valve flow are used, other flow on the lists are ignored
+ public SetRegValvePositionOp(UniCB uniCB, RegValve regV, double posLoPct, double posHiPct, int timeout)
+ {
+ this.uniCB = uniCB;
+ if (this.uniCB == null) throw new ArgumentNullException("ctrlBoard");
+
+ this.regV = regV as RegValve;
+ if (this.regV == null) throw new ArgumentNullException("regValve is null or not Uni");
+ this.regValveNr = this.regV.Idx1;
+
+ this.posLoPct = posLoPct;
+ this.posHiPct = posHiPct;
+ this.timeout = timeout;
+
+ log.Debug(this.ToString());
+ }
+
+ ///
+ /// Set required water flow - no timeout.
+ /// Events: FlowSet
+ ///
+ public SetRegValvePositionOp(UniCB cBoard, RegValve regValve, float posLoPct, float posHiPct)
+ : this(cBoard, regValve, posLoPct, posHiPct, int.MaxValue)
+ {
+ }
+
+ /// Start this operation
+ public void Start()
+ {
+ positionReached = false;
+ expireTime = StateMachine.Time + timeout;
+ log.InfoFormat("Start(): {0} reqPosLo={1}%, reqPosHi={2}%", regV.Name, posLoPct.ToString("F1"), posHiPct.ToString("F1"));
+ opState = OpState.MoveToPosition;
+ }
+
+ ///
+ /// Run this operation
+ ///
+ ///
+ /// Event.None . . . . . . . busy adjusting position
+ /// Event.PositionReached . . position reached
+ /// Event.OpArgumentError . . invalid required position
+ ///
+ public Event Run()
+ {
+ if (opState == OpState.MoveToPosition)
+ {
+ if (posLoPct >= posHiPct || posLoPct > 100.0 || posHiPct < 0)
+ {
+ return Event.OpArgumentError;
+ }
+
+ regV.MoveToPosition(false, posLoPct, posHiPct);
+ opState = OpState.CheckState;
+ log.WarnFormat("Run(): RV#={0}, state={1}, MoveToPosition(false, {2:D1}, {3:D1}) issued", regValveNr, opState, posLoPct, posHiPct);
+ return Event.None;
+ }
+
+ if (positionReached) return Event.PositionReached;
+
+ double positionPct = regV.Position;
+ log.WarnFormat("Run(): RV#={0}, state={1}, pos={2}%", regValveNr, opState, positionPct.ToString("F1"));
+
+ if (opState == OpState.CheckState)
+ {
+ if (posLoPct <= positionPct && positionPct <= posHiPct)
+ {
+ positionReached = true;
+ return Event.PositionReached;
+ }
+ else if (regV.RegValveState != RegValveState.DacValueRegul)
+ {
+ opState = OpState.MoveToPosition; /// Resend move command again in the next run
+ return Event.None;
+ }
+ else
+ {
+ opState = OpState.MovingToPosition;
+ return Event.None;
+ }
+ }
+ else if (StateMachine.Time > expireTime)
+ {
+ return Event.RegulValveTimeOut;
+ }
+ else if (opState == OpState.MovingToPosition)
+ {
+ if (posLoPct <= positionPct && positionPct <= posHiPct)
+ {
+ positionReached = true;
+ return Event.PositionReached;
+ }
+ return Event.None;
+ }
+ return Event.None;
+ }
+
+ /// Stop this operation
+ public void Stop()
+ {
+ }
+ }
+}
diff --git a/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs b/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs
index c763ea87d..9183d9c66 100644
--- a/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs
+++ b/TBF/Rig/Uni/RegValveTandem/RegValveTandem.cs
@@ -39,8 +39,10 @@ namespace TBF.Rig.Uni.RegValveTandem
get { return regValve.Position; }
}
+ ///
+ public int RegulationMinStep { get { return 0; } } /// Analog RegValve not operates with this variable
- public RegValveTandem() { }
+ public RegValveTandem() { }
public RegValveTandem(Generic.IComponentCfg cfg, IList components)
: base(cfg)
diff --git a/TBF/SampleConfig/log4netConfig.xml b/TBF/SampleConfig/log4netConfig.xml
index 338d53558..44205cd62 100644
--- a/TBF/SampleConfig/log4netConfig.xml
+++ b/TBF/SampleConfig/log4netConfig.xml
@@ -38,12 +38,20 @@
+
+
+
+
+
-
+
+
+
+
diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj
index 42eb13944..46aaa5544 100644
--- a/TBF/TBF.csproj
+++ b/TBF/TBF.csproj
@@ -28,7 +28,7 @@
false
true
1
- 2.12.497.%2a
+ 2.12.497.1
false
true
true
@@ -39,7 +39,7 @@
full
false
bin\Debug\
- TRACE;DEBUG;CAMERA;LANG_PL
+ TRACE;DEBUG;CAMERA
prompt
4
true
@@ -60,7 +60,7 @@
true
bin\Debug\
- TRACE;DEBUG;CAMERA;LANG_PL
+ TRACE;DEBUG;CAMERA
full
AnyCPU
prompt
@@ -70,7 +70,7 @@
bin\x86\Release\
- TRACE;CAMERA;LANG_PL
+ TRACE;IPERL;CAMERA
true
pdbonly
AnyCPU
@@ -152,6 +152,7 @@
+
@@ -1345,6 +1346,50 @@
TestMethodCfgCtrl.cs
+
+
+ Component
+
+
+
+ Form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UserControl
+
+
+
+ UserControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UserControl
+
+
+
Component
@@ -1604,46 +1649,6 @@
-
-
- Component
-
-
-
-
-
- Form
-
-
- iPerlCommunicationForm.cs
-
-
-
-
-
-
-
-
-
-
- UserControl
-
-
- IperlHeadCfgCtrl.cs
-
-
-
-
-
-
-
-
- UserControl
-
-
- TestMethodCfgCtrl.cs
-
-
@@ -1787,6 +1792,19 @@
+
+
+
+
+
+
+ UserControl
+
+
+ RegValveCfgCtrl.cs
+
+
+
@@ -2067,6 +2085,10 @@
Strings.resx
+
+
+
+
@@ -2625,6 +2647,9 @@
SharedButtons.cs
+
+ Component
+
Form
@@ -3080,9 +3105,10 @@
GrabImageCfgCtrl.cs
-
- IperlHeadCfgCtrl.cs
-
+
+
+
+
CfgCtrl.cs
@@ -3146,12 +3172,6 @@
TestMethodCfgCtrl.cs
-
- iPerlCommunicationForm.cs
-
-
- TestMethodCfgCtrl.cs
-
TestMethodCfgCtrl.cs
@@ -3164,6 +3184,9 @@
RegValveCfgCtrl.cs
+
+ RegValveCfgCtrl.cs
+
RegValveTandemCfgCtrl.cs
@@ -3339,9 +3362,11 @@
MainWnd.cs
+ Designer
MainWnd.cs
+ Designer
MainWnd.cs
@@ -3351,6 +3376,7 @@
MainWnd.cs
+ Designer
MainWnd.cs
@@ -3447,6 +3473,7 @@
BenchControlPanel.cs
+ Designer
ClosingTbfForm.cs
@@ -3620,6 +3647,22 @@
+
+ {a3e14180-7f00-42e5-94a9-8db62ead6ee8}
+ Sensus.iPerl.RfidCom
+
+
+ {5025ed8b-a94f-4e58-8be0-68481b061609}
+ Sensus.iPerl.TestConsole
+
+
+ {5954d496-caab-4f7a-bde2-bdc8f47dab19}
+ NfcS5_DLL
+
+
+ {fa9abad1-7184-4295-ade8-d44f2e3de6b2}
+ AppDiagnostic
+
{c8939821-ba5c-4988-a3d0-bf53b74865c7}
Common
@@ -3656,6 +3699,10 @@
{0f79ca69-9dbc-41f3-a6fc-5a2937365343}
SchematicDrawing
+
+ {8f942729-f454-4c99-ba6c-746962065ae3}
+ SharedComponents
+
{211b5e3f-9996-48a7-abde-c878dd2d71c2}
SharedDatabase
@@ -3665,9 +3712,7 @@
Results
-
-
-
+
click-eventhandler 'SuggLbOnClick' is called
+ if (!_suggLb.Focused)
+ HideSuggBox();
+ base.OnLostFocus(e);
+ }
+
+ private void SuggLbOnClick(object sender, EventArgs eventArgs)
+ {
+ Text = _suggLb.Text;
+ Focus();
+ }
+
+ private void HideSuggBox()
+ {
+ _suggLb.Visible = false;
+ }
+
+ protected override void OnDropDown(EventArgs e)
+ {
+ HideSuggBox();
+ base.OnDropDown(e);
+ }
+
+ #endregion
+
+ #region keystroke events
+
+ ///
+ /// if the suggest-ListBox is visible some keystrokes
+ /// should behave in a custom way
+ ///
+ ///
+ protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
+ {
+ if (!_suggLb.Visible)
+ {
+ base.OnPreviewKeyDown(e);
+ return;
+ }
+
+ switch (e.KeyCode)
+ {
+ case Keys.Down:
+ if (_suggLb.SelectedIndex < _suggBindingList.Count - 1)
+ _suggLb.SelectedIndex++;
+ return;
+ case Keys.Up:
+ if (_suggLb.SelectedIndex > 0)
+ _suggLb.SelectedIndex--;
+ return;
+ case Keys.Enter:
+ Text = _suggLb.Text;
+ Select(0, Text.Length);
+ _suggLb.Visible = false;
+ return;
+ case Keys.Escape:
+ HideSuggBox();
+ return;
+ }
+
+ base.OnPreviewKeyDown(e);
+ }
+
+ private static readonly Keys[] KeysToHandle = new[] { Keys.Down, Keys.Up, Keys.Enter, Keys.Escape };
+ protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
+ {
+ // the keysstrokes of our interest should not be processed be base class:
+ if (_suggLb.Visible && KeysToHandle.Contains(keyData))
+ return true;
+ return base.ProcessCmdKey(ref msg, keyData);
+ }
+
+ #endregion
+ }
+}
diff --git a/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml b/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml
index 338d53558..44205cd62 100644
--- a/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml
+++ b/TBFTests/bin/Debug/SampleConfig/log4netConfig.xml
@@ -38,12 +38,20 @@
+
+
+
+
+
-
+
+
+
+
diff --git a/Workplace/Workplace.csproj b/Workplace/Workplace.csproj
index 59fd4ec78..c758637dd 100644
--- a/Workplace/Workplace.csproj
+++ b/Workplace/Workplace.csproj
@@ -14,6 +14,22 @@
512
+ false
+ C:\tbf_deploy\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 1
+ 1.0.0.%2a
+ false
+ true
+ true
AnyCPU
@@ -39,6 +55,18 @@
Workplace.Program
+
+ 0C1DEA4DC362ABEC19575CCB5AD47FEDF4B135C1
+
+
+ Workplace_TemporaryKey.pfx
+
+
+ true
+
+
+ true
+
..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll
@@ -247,6 +275,7 @@
Settings.settings
True
+
@@ -273,7 +302,18 @@
-
+
+
+ False
+ Microsoft .NET Framework 4.7.2 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+