Files
laatzen/Common/Ui/GenesisToolBox/FrmTempMeter.cs
T

761 lines
24 KiB
C#

using 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 Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages;
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Logic.SoftwareAccessHelper;
namespace Xylem.Common.Ui.GenesisToolBox
{
public partial class FrmTempMeter : Form
{
public class CordonelTempLut
{
public Int32 Id { get; set; }
public Int32 PcbId { get; set; }
public Double RefTempC { get; set; }
public Double AvgTof { get; set; }
public Boolean Active { get; set; }
}
public class LutTemp
{
public Int32 PcbId { get; set; }
public Int32 FromTempC { get; set; }
public Int32 ToTempC { get; set; }
public Double? AvgRefTempC { get; set; }
public List<Double> ListOfRecordedTofs { get; set; }
public Double? AvgTofs { get; set; }
}
public FrmTempMeter()
{
InitializeComponent();
SetEnable(programmState.Start);
}
public ZeroFlowGenesisMeter _currentGenesis { get; private set; }
public MeterBatch _meterBatch { get; private set; }
private void btnConnect_Click(Object sender, EventArgs e)
{
Connect();
}
private void Connect()
{
try
{
Int32 slotNr;
if (string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) ||
!int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNr))
{
return;
}
//var drive = 1;
_currentGenesis?.DisposeMeter();
//dispose old meter
_meterBatch = new MeterBatch();
_currentGenesis = null;
Thread.Sleep(200);
//assign new meter and assign meter to FW update file if this exists
_currentGenesis = new ZeroFlowGenesisMeter(slotNr, 3, false);
//_currentGenesis.SetupFromConfigFile(slotNr);
_meterBatch.AddMeter(_currentGenesis);
Task.Factory.StartNew(() =>
{
_meterBatch.MetersLogin();
if (!_currentGenesis.IsLoggedOn)
{
Thread.Sleep(2000);
_meterBatch.MetersLogin();
}
if (!_currentGenesis.IsLoggedOn)
{
SetEnable(programmState.Start);
return;
}
var a = GetLutsText(_currentGenesis.PcbId);
//
_currentGenesis.InitMeasurement();
Invoke(new Action(() =>
{
txtLuts.Text = a;
if (LutsMissing)
{
txtLuts.BackColor = Color.IndianRed;
}
else
{
txtLuts.BackColor = Color.LightGreen;
}
lblPcbId.Text = _currentGenesis.PcbId;
SetEnable(programmState.Connected);
}));
});//.ContinueWith(delegate { ViewProgressPcb(false); });
}
catch (Exception ex)
{
txtLuts.Text = "-";
MessageBox.Show(ex.Message);
SetEnable(programmState.Start);
}
}
private void btnRefreshLut_Click(Object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(_currentGenesis?.PcbId))
{
Task.Factory.StartNew(() =>
{
var a = GetLutsText(_currentGenesis.PcbId);
Invoke(new Action(() =>
{
txtLuts.Text = a;
if (LutsMissing)
{
txtLuts.BackColor = Color.IndianRed;
}
else
{
txtLuts.BackColor = Color.LightGreen;
}
}));
});
}
else
{
txtLuts.Text = "-";
}
}
public class RefTempRange
{
public Double Min { get; set; }
public Double Max { get; set; }
}
private List<RefTempRange> ReftempRangeReq = new List<RefTempRange>()
{
new RefTempRange() { Min = 7, Max= 9 },
new RefTempRange() { Min = 13,Max = 15 },
new RefTempRange() { Min = 16,Max = 18 },
new RefTempRange() { Min = 19,Max = 20 },
new RefTempRange() { Min = 20,Max = 22 },
new RefTempRange() { Min = 23,Max = 25 },
new RefTempRange() { Min = 26,Max = 28 },
new RefTempRange() { Min = 28,Max = 30 },
new RefTempRange() { Min = 33,Max = 36 },
};
private List<CordonelTempLut> cordonelTempLut = null;
private Boolean LutsMissing = false;
private String GetLutsText(String PcbId)
{
var ret = new StringBuilder();
var err = 0;
var resp = LocalWebRequest.GetRequest($"http://10.49.40.25/MeterProcessState/api/TempFlange/GetLut?PcbId={PcbId}");
ret.AppendLine($"Ref Temp C°\t|\t AvgTof");
var CurrentReqRequierd = new List<RefTempRange>();
CurrentReqRequierd.AddRange(ReftempRangeReq);
try
{
cordonelTempLut = JsonConvert.DeserializeObject<List<CordonelTempLut>>(resp);
foreach (var item in cordonelTempLut.OrderBy(a => a.RefTempC))
{
CurrentReqRequierd.RemoveAll(rem => item.RefTempC >= rem.Min && item.RefTempC <= rem.Max);
ret.AppendLine($"{item.RefTempC.ToString("n8")}\t|\t{item.AvgTof}");
}
}
catch (Exception)
{
ret.AppendLine($"No entrys");
}
LutsMissing = false;
foreach (var item in CurrentReqRequierd)
{
LutsMissing = true;
ret.AppendLine($"{item.Min}-{item.Max}\t|\t Missing");
}
return ret.ToString();
}
private programmState State = programmState.Start;
private enum programmState
{
Start,
Connected,
RecordRuning,
RecordStoped,
RecodCalculated,
}
private void SetEnable(programmState state)
{
State = state;
switch (State)
{
case programmState.Start:
btnStartRecord.Enabled = false;
btnStopRecord.Enabled = false;
btnAddLut.Enabled = false;
nudRef.Visible = false;
btnRefreshLut.Enabled = false;
break;
case programmState.Connected:
btnStartRecord.Enabled = true;
btnStopRecord.Enabled = false;
btnAddLut.Enabled = false;
nudRef.Visible = false;
btnRefreshLut.Enabled = true;
break;
case programmState.RecordRuning:
btnStartRecord.Enabled = false;
btnStopRecord.Enabled = true;
btnAddLut.Enabled = false;
nudRef.Visible = false;
btnRefreshLut.Enabled = true;
break;
case programmState.RecordStoped:
btnStartRecord.Enabled = true;
btnStopRecord.Enabled = false;
btnAddLut.Enabled = true;
nudRef.Visible = true;
btnRefreshLut.Enabled = true;
break;
default:
break;
}
}
public void tmp()
{
//var cRecords = _currentGenesis.CurrentRecords.ToList();
//Log($"cRecords.Count={cRecords.Count}");
//if (cRecords != null && cRecords.Any())
//{
// decimal checkTempMeter = 0;
// if (MeterTempMode == TempMode.CalcTof)
// {
// //
// var sumTof = 0.0;
// var countTof = 0;
// foreach (var tofItem in cRecords.Where(c => c.Channel == 2))
// {
// if (tofItem.Channel == 2)
// {
// Log($"TotalTimeOfFlightS;{(tofItem.TotalTimeOfFlightS * 1000).ToString()}");
// Log($"RAWTEMP;{interPol(TempFromTofLUT, (tofItem.TotalTimeOfFlightS * 1000))}");
// sumTof = (tofItem.TotalTimeOfFlightS * 1000) + sumTof;
// countTof = countTof + 1;
// }
// }
// var x = (sumTof / countTof) / 1000;
// Log($"avgTof;{x}({sumTof}/{countTof})");
// checkTempMeter = interPol(TempFromTofLUT, x);
// Meter.CurrentRecords.Clear();
// }
// else
// {
// checkTempMeter = (decimal)cRecords.Last().TemperatureDegC;
// }
//}
}
private DateTimeOffset start;
private Task tempTask;
private void BtnStartRecord_Click(Object sender, EventArgs e)
{
automatic = false;
start = DateTimeOffset.Now;
_currentGenesis.StartRecordData();
_currentGenesis.WriteRegister<Byte>(Register.Genesisflow.SampleRate, 16, checkRegister: true);
SetEnable(programmState.RecordRuning);
timer2.Enabled = true;
}
private void BtnStopRecord_Click(Object sender, EventArgs e)
{
timer2.Enabled = false;
OutputAvgTof(true);
_currentGenesis.WriteRegister<Byte>(Register.Genesisflow.SampleRate, 0, checkRegister: true);
SetEnable(programmState.RecordStoped);
}
private void btnAddLut_Click(Object sender, EventArgs e)
{
var req = LocalWebRequest.PostRequestAsync($"http://10.49.40.25/MeterProcessState/api/TempFlange/AddLut?PcbId={_currentGenesis.PcbId}&RefTempC={nudRef.Value.ToString().Replace(",", ".")}&AvgTof={lblAvgDutTof.Text.Replace(",", ".")}");
SetEnable(programmState.Connected);
}
private void btnCheck_Click(Object sender, EventArgs e)
{
if (btnCheck.Text == "Start Check")
{
_currentGenesis.StartRecordData();
timer1.Enabled = true;
btnCheck.Text = "Stop Check";
}
else
{
_currentGenesis.StopRecordData();
timer1.Enabled = false;
btnCheck.Text = "Start Check";
}
}
private static Decimal interPol(List<CordonelTempLut> points, Double x)
{
var x1 = 0.000;
var y1 = 0.000;
var x2 = 0.000;
var y2 = 0.000;
Decimal checkTempMeter;
if ((x <= points[0].AvgTof) && (x >= points.Last().AvgTof))
{
var i = 0;
foreach (var val in points)
{
if (points[i].AvgTof <= x)
{
x1 = points[i - 1].AvgTof;
y1 = points[i - 1].RefTempC;
x2 = points[i].AvgTof;
y2 = points[i].RefTempC;
break;
}
i = i + 1;
}
checkTempMeter = (Decimal)((y2 - y1) / (x2 - x1) * (x - x1) + y1);
}
else
{
checkTempMeter = 1;
}
return checkTempMeter;
}
private void timer1_Tick(Object sender, EventArgs e)
{
try
{
var cRecords = _currentGenesis.CurrentRecords.ToList();
if (cRecords != null && cRecords.Any())
{
Decimal checkTempMeter = 0;
//
var sumTof = 0.0;
var countTof = 0;
foreach (var tofItem in cRecords.Where(c => c.Channel == 2))
{
if (tofItem.Channel == 2)
{
sumTof = (tofItem.TotalTimeOfFlightS * 1000) + sumTof;
countTof = countTof + 1;
}
}
var x = (sumTof / countTof) / 1000;
checkTempMeter = interPol(cordonelTempLut, x);
var a = new Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord();
while (_currentGenesis.CurrentRecords.TryDequeue(out a))
{
// do nothing
}
lblCheck.Text = checkTempMeter.ToString();
}
else
{
lblCheck.Text = $"temp NA";
}
}
catch (Exception ex)
{
lblCheck.Text = $"temp NA - {ex.Message}";
}
}
private void timer2_Tick(Object sender, EventArgs e)
{
if (State == programmState.RecordRuning)
{
if (automatic)
{
}
else
{
OutputAvgTof();
}
}
}
private void OutputAvgTof(Boolean stop = false)
{
try
{
StringBuilder cTofs = new StringBuilder();
var listOfRec = _currentGenesis.CurrentRecords.Where(s => s.Channel == 2).ToList();
if (stop)
{
_currentGenesis.StopRecordData();
}
var list = listOfRec.Select(s => new { ToF = s.TotalTimeOfFlightS * 1000, Channel = s.Channel });
foreach (var item in list.OrderBy(o => o.Channel))
{
cTofs.Append(item.Channel);
cTofs.Append(":");
cTofs.AppendLine((item.ToF / 1000).ToString());
}
lblAvgDutTof.Text = (list.Average(s => s.ToF) / 1000).ToString();
txtCurrentTofs.Text = cTofs.ToString();
lblLines.Text = list.Count().ToString(); ;
lblDuration.Text = $"{(DateTimeOffset.Now - start).TotalSeconds}S";
}
catch (Exception ex)
{
txtCurrentTofs.Text = ex.Message;
}
}
private Boolean automatic = false;
private void button1_Click_1(Object sender, EventArgs e)
{
automatic = true;
start = DateTimeOffset.Now;
_currentGenesis.StartRecordData();
_currentGenesis.WriteRegister<Byte>(Register.Genesisflow.SampleRate, 16, checkRegister: true);
SetEnable(programmState.RecordRuning);
tempTask = new Task(() => { RunTemConnection(); });
tempTask.Start();
timer2.Enabled = true;
timer3.Enabled = true;
}
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 (NamedPipeClientStream 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 (StreamReader 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 button2_Click(Object sender, EventArgs e)
{
timer3.Enabled = false;
timer2.Enabled = false;
MergeToAutoFile();
_currentGenesis.WriteRegister<Byte>(Register.Genesisflow.SampleRate, 0, checkRegister: true);
SetEnable(programmState.RecordStoped);
//
}
private List<ToFTime> toFTimes = new List<ToFTime>();
private void MergeToAutoFile()
{
List<TempTofCalc> itimestowri = new List<TempTofCalc>();
TempTofCalc lItem;
while (listTempTime.TryDequeue(out lItem))
{
itimestowri.Add(lItem);
}
var fiName = $"{_currentGenesis.PcbId}_{start.ToString("yyyy_MM_dd_HH-mm-ss")}.TempTof";
String jsonData = JsonConvert.SerializeObject(itimestowri.ToList());
jsonData = jsonData.TrimStart('[').TrimEnd(']');
if (File.Exists(fiName))
{
jsonData = $",{jsonData}";
}
System.IO.File.AppendAllText(fiName, jsonData);
}
private Double TempConstMarker = 0.01;
private Int32 PlateauMinLengt = 15;
private List<TempTofCalc> toGrid = new List<TempTofCalc>();
private void btnUpdateGrid_Click(Object sender, EventArgs e)
{
//double LastTempJumpDetect = double.MinValue;
//int currentGrp = 0;
//int currentPlateauCount = 0;
//Dictionary<int, int> PlateauRefs = new Dictionary<int, int>();
//foreach (var item in tmpGrid)
//{
// //fist hit
// if (LastTempJumpDetect == double.MinValue || LastTempJumpDetect - TempConstMarker >= item.RefTemp || LastTempJumpDetect + TempConstMarker <= item.RefTemp)
// {
// LastTempJumpDetect = item.RefTemp;
// currentGrp = currentGrp + 1;
// PlateauRefs.Add(currentGrp, 0);
// }
// if (PlateauRefs.ContainsKey(currentGrp))
// {
// PlateauRefs[currentGrp] = PlateauRefs[currentGrp] + 1;
// }
// var clone = item;
// clone.PlateauNr = currentGrp;
// toGrid.Add(clone);
//}
//var bindingList = new BindingList<TempTofCalc>(toGrid);
//var source = new BindingSource(bindingList, null);
//dataGridView1.DataSource = source;
//dataGridView1.AutoGenerateColumns = true;
//dataGridView1.Refresh();
//int c = 0;
//foreach (var item in toGrid)
//{
// if (PlateauRefs.ContainsKey(item.PlateauNr) && PlateauRefs[item.PlateauNr] >= PlateauMinLengt)
// {
// dataGridView1.Rows[c].DefaultCellStyle.BackColor = Color.Green;
// }
// else
// {
// dataGridView1.Rows[c].DefaultCellStyle.BackColor = Color.Red;
// }
// c = c + 1;
//}
}
private void timer3_Tick(Object sender, EventArgs e)
{
MergeToAutoFile();
}
private Double generateTof(Random r , Double temp)
{
var tmp = r.Next(1, 5);
var retrn = (temp / 9000) - ((Math.Pow(temp, 1.6) / 100000));
return retrn - ((retrn * tmp / 100) + ((Math.Pow(tmp, 1.6) / 100000)));
}
private void button3_Click(Object sender, EventArgs e)
{
List<TempTofCalc> refTempss = new List<TempTofCalc>();
var sDate = DateTime.UtcNow;
Double refTemp = 5.0;
for (Int32 i = 0; i <= 5; i++)
{
Double needUp = 2.5;
var rramp = new Random();
var rtof = new Random();
//plateau
while (needUp >= 0)
{
var temp = rramp.NextDouble() / (needUp * 100);//+0
needUp = needUp - temp;
refTemp = refTemp + temp;
refTempss.Add(new TempTofCalc() { RefDate = sDate.AddSeconds(refTempss.Count), RefTemp = refTemp, Tof = generateTof(rtof, refTemp) });
}
var ra = new Random();
var tillI = ra.Next(150, 4000);//+0
var r = new Random(tillI);
for (Int32 platI = 0; platI < tillI; platI++)
{
var temp = r.NextDouble() / 5;
refTempss.Add(new TempTofCalc() { RefDate = sDate.AddSeconds(refTempss.Count), RefTemp = refTemp + temp, Tof = generateTof(rtof, refTemp) });
}
}
String jsonData = JsonConvert.SerializeObject(refTempss);
System.IO.File.AppendAllText($"124563_{start.ToString("yyyy_MM_dd_HH-mm-ss")}.TempTof", jsonData);
}
}
}