common/Ui/GenesisToolBox/FrmManCalibration.cs
2026-04-23 17:50:07 +02:00

742 lines
24 KiB
C#

namespace Xylem.Common.Ui.GenesisToolBox
{
using global::CordonelPreadjustmentUi;
using Newtonsoft.Json;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using TempFlansh;
using Xylem.Common.CommonCore.Configuration;
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages;
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Logic.ProductionOrderCore.OrderData;
using Xylem.Common.Logic.SoftwareAccessHelper;
using Xylem.Common.Ui.GenesisToolBox.Infrastructure;
public partial class FrmManCalibration : Form
{
private ToolStripLabel slotsLabel;
private ToolStripComboBox slotsList;
private ToolStripLabel pcbidLabel;
private ToolStripTextBox pcbidTextBox;
private ToolStripButton connectBtn;
private ToolStripButton disconnectBtn;
private ToolStripButton testBtn;
private ProgrammState programmState;
private ZeroFlowGenesisMeter currentGenesis;
private MeterBatch meterBatch;
private Boolean lutIsMissing;
private List<RefTempRange> reftempRangeReq;
private List<CordonelTempLut> cordonelTempLut;
public FrmManCalibration()
{
this.InitializeComponent();
InitializeContent();
this.meterBatch = new MeterBatch();
nudCal1.Maximum = Int32.MaxValue;
nudCal2.Maximum = Int32.MaxValue;
nudCal3.Maximum = Int32.MaxValue;
nudZeroOffset1.Minimum = Int32.MinValue;
nudZeroOffset2.Minimum = Int32.MinValue;
nudZeroOffset3.Minimum = Int32.MinValue;
}
private void BtnConnect_Click(Object sender, EventArgs e)
=> this.Connect();
private void Connect()
{
try
{
if (int.TryParse($"{this.slotsList.SelectedItem}", out var slotNr))
{
var meter = new ZeroFlowGenesisMeter(slotNr,3, false);
this.meterBatch.AddMeter(meter);
Task.Factory.StartNew(() =>
{
meter.Login();
if (!meter.IsLoggedOn)
{
Thread.Sleep(2000);
meter.Login();
}
}
);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
SetEnabled(ProgrammState.Start);
}
}
private void UpdateConnectedMetersList()
{
this.InvokeOnUIThread(() =>
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is ZeroFlowGenesisMeter gns)
{
var pcbId = gns.PcbId;
var connected = !string.IsNullOrWhiteSpace(pcbId);
var item = new ListViewItem
{
BackColor = connected ? Color.LightGreen : Color.IndianRed,
Text = pcbId,
};
}
}
});
}
private class TempTime
{
public TempTime(Double temp)
{
date = DateTime.UtcNow;
Temp = temp;
}
public TempTime(String temp)
{
Double tmp = double.MinValue;
if (double.TryParse(temp, out tmp))
{
date = DateTime.UtcNow;
Temp = tmp;
}
}
public DateTime date;
public Double Temp;
}
private class ToFTime
{
public ToFTime(Double temp, DateTimeOffset date)
{
Date = date.ToUniversalTime().DateTime;
Tof = temp;
}
public DateTime Date;
public Double Tof;
}
private ConcurrentQueue<TempTofCalc> listTempTime = new ConcurrentQueue<TempTofCalc>();
private void RunTemConnection()
{
using (var pipeClient = new NamedPipeClientStream(".", "TempPipe", PipeDirection.In))
{
// Connect to the pipe or wait until the pipe is available.
//Console.Write("Attempting to connect to pipe...");
pipeClient.Connect();
//Console.WriteLine("Connected to pipe.");
//Console.WriteLine("There are currently {0} pipe server instances open.",
// pipeClient.NumberOfServerInstances);
using (var sr = new StreamReader(pipeClient))
{
string temp;
while ((temp = sr.ReadLine()) != null)
{
CalibrationRecord record;
Double avgTof = 0;
Double reftemp = 0;
if (double.TryParse(temp, out reftemp))
{
avgTof = 0;
var i = 0;
while (currentGenesis.CurrentRecords.TryDequeue(out record))
{
if (record.Channel == 2)
{
avgTof = avgTof + record.TotalTimeOfFlightS;
i = 1 + i;
}
}
if (i > 0)
{
avgTof = avgTof / i;
if (!double.IsNaN(avgTof))
{
listTempTime.Enqueue(new TempTofCalc() { RefDate = DateTime.Now, RefTemp = reftemp, Tof = avgTof });
if (avgTof.ToString().Contains("a"))
{
}
}
}
}
}
}
}
}
private void InitializeContent()
{
this.mainMenuStrip.Padding = new Padding(5);
var menuFont = this.mainMenuStrip.Font;
var fontBold = new Font(menuFont.FontFamily, menuFont.Size, FontStyle.Bold);
this.slotsLabel = new ToolStripLabel
{
Text = "Slot: ",
AutoSize = true,
Font = fontBold,
ForeColor = Color.Gray
};
this.slotsList = new ToolStripComboBox
{
Items = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 },
SelectedIndex = 0,
AutoSize = true,
FlatStyle = FlatStyle.System,
DropDownStyle = ComboBoxStyle.DropDownList,
};
this.pcbidLabel = new ToolStripLabel
{
Text = "Pcb Id: ",
AutoSize = true,
TextAlign = ContentAlignment.MiddleRight,
Font = fontBold,
Margin = new Padding(10, 0, 0, 0),
ForeColor = Color.Gray
};
this.pcbidTextBox = new ToolStripTextBox
{
Text = "n/a",
AutoSize = true,
TextAlign = ContentAlignment.MiddleRight,
BorderStyle = BorderStyle.None,
ReadOnly = true,
BackColor = this.slotsList.BackColor
};
this.connectBtn = new ToolStripButton
{
Text = "Connect",
AutoSize = true,
Font = fontBold,
TextAlign = ContentAlignment.MiddleCenter,
Margin = new Padding(10, 0, 0, 0),
Padding = new Padding(10, 0, 10, 0),
BackColor = Color.LightGray,
Visible = true
};
this.connectBtn.Click += this.BtnConnect_Click;
this.disconnectBtn = new ToolStripButton
{
Text = "Disconnect",
AutoSize = true,
Font = fontBold,
TextAlign = ContentAlignment.MiddleCenter,
Margin = new Padding(10, 0, 0, 0),
Padding = new Padding(10, 0, 10, 0),
BackColor = Color.LightGray,
Visible = true
};
this.disconnectBtn.Click += this.BtnDisconnect_Click;
this.testBtn = new ToolStripButton
{
Text = "Test",
AutoSize = true,
Font = fontBold,
TextAlign = ContentAlignment.MiddleCenter,
Margin = new Padding(5, 0, 0, 0),
Padding = new Padding(10, 0, 10, 0),
BackColor = Color.LightGray
};
this.mainMenuStrip.Items.Add(this.slotsLabel);
this.mainMenuStrip.Items.Add(this.slotsList);
this.mainMenuStrip.Items.Add(this.pcbidLabel);
this.mainMenuStrip.Items.Add(this.pcbidTextBox);
this.mainMenuStrip.Items.Add(this.connectBtn);
this.mainMenuStrip.Items.Add(this.disconnectBtn);
this.mainMenuStrip.Items.Add(this.testBtn);
this.SetEnabled(ProgrammState.Start);
}
private void BtnDisconnect_Click(Object sender, EventArgs args)
{
try
{
this.currentGenesis.Dispose();
}
catch (Exception e)
{
Console.WriteLine(e);
}
finally
{
this.meterBatch.RemoveMeter(this.currentGenesis);
}
this.InvokeOnUIThread(new Action(() =>
{
this.currentGenesis = null;
this.pcbidTextBox.Text = "not connected";
this.SetEnabled(ProgrammState.Start);
this.UpdateConnectedMetersList();
}));
}
private void SetEnabled(ProgrammState state)
{
this.programmState = state;
}
private bool automatic = false;
private Object connectedMeters;
public void StartRecording()
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is ZeroFlowGenesisMeter zfgnsm)
{
zfgnsm.StartRecordData();
}
}
}
public void AddMessage(String message)
{
this.BeginInvoke(new Action(() =>
{
try
{
//var text = $"{message}{Environment.NewLine}" + this.automaticContentBox.Text;
//text = text.Substring(0, Math.Min(2000, text?.Length ?? 0));
//this.automaticContentBox.ResetText();
//this.automaticContentBox.AppendText(text);
//this.automaticContentBox.ScrollBars = RichTextBoxScrollBars.None;
}
catch (Exception)
{
// TODO: implement logging.
}
}));
}
protected override void OnClosed(EventArgs args)
{
this.meterBatch.Dispose();
base.OnClosed(args);
}
protected override void OnFormClosed(FormClosedEventArgs e)
=> this.BtnDisconnect_Click(default(Object), EventArgs.Empty);
public void InvokeOnUIThread(Action action)
=> this.Invoke(action);
public bool StopLED(int slot)
{
try
{
foreach (var meter in this.meterBatch.ListOfMeters.Where(m => m.Slot == slot))
{
if (meter is ZeroFlowGenesisMeter zfgnsm)
{
if (!zfgnsm.IsLoggedOn)
{
zfgnsm.ReLogin();
}
zfgnsm.SetLcdText(false, new Byte[] { 0x10, 0x10 });
return true;
}
}
}
catch (Exception)
{
return false;
}
return false;
}
public bool StartLED(int slot)
{
try
{
foreach (var meter in this.meterBatch.ListOfMeters.Where(m => m.Slot == slot))
{
if (meter is ZeroFlowGenesisMeter zfgnsm)
{
if (!zfgnsm.IsLoggedOn)
{
zfgnsm.ReLogin();
}
zfgnsm.SetLcdText(true, new byte[] { 0x00, 0x00 });
return true;
}
}
}
catch (Exception)
{
return false;
}
return false;
}
private void MeterSelected(Object sender, ListViewItemSelectionChangedEventArgs e)
{
var pcbId = e?.Item?.Text;
this.InvokeOnUIThread(() =>
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is ZeroFlowGenesisMeter zfgnsm && zfgnsm.PcbId == pcbId)
{
this.currentGenesis = zfgnsm;
this.pcbidTextBox.Text = pcbId;
break;
}
}
});
}
private void btnWirte_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
gen.WriteRegister("GENESISFLOW_SampleRate", (int)nudSampleRate.Value);
}
}
}
private void BtnWritetemp_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
UInt32 TempToRegister = (UInt32)(nudTemp.Value * 4096);
gen.WriteRegister(Register.Genesisflow.ToFTempCalibrate, TempToRegister);
gen.Logout();
}
}
}
private void brnRead_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
gen.ReLogin();
lblTof1.Text = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.ToFTempOffset1), 0).ToString();
lblTof2.Text = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.ToFTempOffset2), 0).ToString();
lblTof3.Text = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.ToFTempOffset3), 0).ToString();
nudZeroOffset1.Value = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.ZeroOffset1), 0);
nudZeroOffset2.Value = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.ZeroOffset2), 0);
nudZeroOffset3.Value = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.ZeroOffset3), 0);
nudCal1.Value = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.CalFactor1), 0);
nudCal2.Value = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.CalFactor2), 0);
nudCal3.Value = BitConverter.ToInt32(gen.ReadRegister(Register.Genesisflow.CalFactor3), 0);
}
}
}
private void button3_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
gen.ReLogin();
gen.WriteRegister(Register.Genesisflow.ZeroOffset1, nudZeroOffset1.Value);
gen.WriteRegister(Register.Genesisflow.ZeroOffset2, nudZeroOffset2.Value);
gen.WriteRegister(Register.Genesisflow.ZeroOffset3, nudZeroOffset3.Value);
var r = gen.WriteRegister(Register.Genesisflow.CalFactor1, (UInt16)nudCal1.Value, true,true);
gen.WriteRegister(Register.Genesisflow.CalFactor2, (UInt16)nudCal2.Value, true, true);
gen.WriteRegister(Register.Genesisflow.CalFactor3, (UInt16)nudCal3.Value, true, true);
gen.WriteRegister(Register.Genesisflow.StoreCalibration, 1);
gen.Logout();
}
}
}
private void ReCalibration_Click(Object sender, EventArgs e)
{
}
private void btnStartM_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
gen.StartMeasurement();
}
}
}
private void btnRefeshM_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
try
{
var r = gen.GetAllMeasurementResults(null, null, true);
foreach (var item in r)
{
switch (item.Channel)
{
case 0 :
lblFlowDisplay.Text = item.DutFlowRateCmPh.ToString();
break;
case 1:
lblFlowChnl1.Text = item.DutFlowRateCmPh.ToString();
break;
case 2:
lblFlowChnl2.Text = item.DutFlowRateCmPh.ToString();
break;
case 3:
lblFlowChnl3.Text = item.DutFlowRateCmPh.ToString();
break;
}
}
}
catch (Exception)
{
throw;
}
}
}
}
private void btnStopM_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
gen.GetAllMeasurementResults(null, null, true);
}
}
}
private void tabInit_Click(Object sender, EventArgs e)
{
}
private void btnGet_Click(Object sender, EventArgs e)
{
dgvInit.Rows.Clear();
var listRegs = new List<object>();
dgvInit.Rows.Add(new[] { Register.Genesisflow.CalFactor1, "15625", "15625" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.CalFactor2, "15625", "15625" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.CalFactor3, "15625", "15625" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.ZeroOffset1, "0", "0" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.ZeroOffset2, "0", "0" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.ZeroOffset3, "0", "0" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.MeterSize, cb_Metersize.SelectedItem.GetHashCode().ToString(), cb_Metersize.SelectedItem.GetHashCode().ToString() });
dgvInit.Rows.Add(new[] { Register.Genesisflow.LedMode, "6", "6" });
dgvInit.Rows.Add(new[] { Register.Genesisflow.TriggerActive, "1", "1" });
var r = LocalWebRequest.GetRequest($"{ ServiceUrls.GenesisFinalCheckServiceUrl()}GetMetersizeProgrammingData?MeterSize={cb_Metersize.SelectedItem.GetHashCode().GetHashCode()}", 2000);
var dt = JsonConvert.DeserializeObject<Dictionary<string, UInt32>>(r);
foreach (var item in dt)
{
dgvInit.Rows.Add(new[] { item.Key, item.Value.ToString(), item.Value.ToString() });
}
}
private void multiflancshCalibration_SelectedIndexChanged(Object sender, EventArgs e)
{
cb_Metersize.Items.Clear();
foreach (MeterSize size in (MeterSize[])Enum.GetValues(typeof(MeterSize)))
{
cb_Metersize.Items.Add(size);
}
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
var r = gen.ReadRegister(Register.Genesisflow.MeterSize);
var v = RegisterConverter.ByteArrayToValue<int>(r);
foreach (MeterSize size in (MeterSize[])Enum.GetValues(typeof(MeterSize)))
{
if (v == size.GetHashCode())
{
cb_Metersize.SelectedItem = size;
}
}
}
}
}
private void btnSet_Click(Object sender, EventArgs e)
{
foreach (var meter in this.meterBatch.ListOfMeters)
{
if (meter is GenesisMeter gen)
{
foreach (var item in dgvInit.Rows)
{
if (item is DataGridViewRow row)
{
int val = 0;
Int64 valBig =0;
if (int.TryParse(row.Cells[1].Value.ToString(), out val))
{
if (!gen.WriteRegister(row.Cells[0].Value.ToString(), val))
{
MessageBox.Show(@"Error");
}
}
else if (Int64.TryParse(row.Cells[1].Value.ToString(), out valBig))
{
if (!gen.WriteRegister(row.Cells[0].Value.ToString(), valBig))
{
MessageBox.Show(@"Error");
}
}
}
}
}
}
}
AmpHelper amp = new AmpHelper();
private void btnLoad_Click(Object sender, EventArgs e)
{
amp = new AmpHelper();
amp.Init();
}
private void ShowAmps()
{
//foreach (var item in collection)
//{
//}
//dgvAmps
}
}
}