Enable ShowDialog for PoseidonCmd, add UI improvements in TestStartEndForm, and introduce new methods for handling reader data and controls.

This commit is contained in:
Michal Buzik 2025-11-13 14:21:23 +01:00
parent c3c21649fb
commit 1e2777c5e7
7 changed files with 826 additions and 427 deletions

View File

@ -8,10 +8,8 @@ using System.Windows.Forms;
using log4net;
using Common;
using TBF.Rig.Sequences;
using TBF.Rig.Output.DB.SensusOracle;
using TBF.Resources;
using System.Drawing;
using NHibernate;
namespace TBF.Rig.DataEntry.PoseidonCmd
{

View File

@ -61,6 +61,15 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
CurrentOp currentOp;
public enum ReadDataOp
{
None,
Start,
Busy,
Done,
}
ReadDataOp readDataOp;
public EntryForm() { }
@ -112,6 +121,7 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
|| currentOp == CurrentOp.SendStartDataStream)
) throw new Exception("Sequence error");
currentOp = CurrentOp.ReadDatastream_StartStates;
readDataOp = ReadDataOp.None;
//TODO BUMI apply show data in dialog if config required
//entryFormCfg.Direction = Direction.S640;
//currentOp = CurrentOp.EnterTestStartStates;
@ -122,10 +132,14 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
if (reader != null && reader is PoseidonReader)
{
PoseidonReader poseidonReader = (reader as PoseidonReader);
if (!string.IsNullOrEmpty(poseidonReader.SerialNr)
&& waterMeters.Count > iterator)
if (waterMeters.Count > iterator)
{
waterMeters[iterator].SerialNr = poseidonReader.SerialNr;
if(string.IsNullOrEmpty(poseidonReader.SerialNr))
waterMeters[iterator].SerialNr = poseidonReader.SerialNr;
else
{
waterMeters[iterator].SerialNr = "*";
}
}
}
@ -135,8 +149,17 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
}
/// <returns>null (not implemented)</returns>
public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList<Results.Entities.WaterMeter> waterMeters, bool isCondOp) { return null; }
public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; }
public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders,
IList<Results.Entities.WaterMeter> waterMeters, bool isCondOp)
{
return null;
}
public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo,
double errLimHi)
{
return null;
}
/// <returns>Reference to the operation</returns>
public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi)
@ -181,6 +204,10 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
/// <summary>Start this operation</summary>
public void Start()
{
readDataOp = ReadDataOp.None;
readAndSetDataToMeters = false;
filedDataToMeters = false;
if (!ShowForm)
return ;
@ -188,8 +215,8 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
switch (currentOp)
{
case CurrentOp.SendStartDataStream:
ReadAndSetDataToMeters();
if (ProcessData.SelectedProcedure.OrderInfo == null || entryFormCfg.Direction != Direction.S640)
//ReadAndSetDataToMeters();
if (ProcessData.SelectedProcedure.OrderInfo == null)
{
Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this);
}
@ -209,28 +236,70 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
}
}
private bool readAndSetDataToMeters = false;
private bool filedDataToMeters = false;
/// <summary>Run this operation</summary>
/// <returns>Event.ResultsPrinted</returns>
public Event Run()
{
ReadAndSetDataToMeters();
if (!readAndSetDataToMeters) // run until not finished
readAndSetDataToMeters = ReadAndSetDataToMeters();
if (!ShowForm)
return Event.ModelessFormClosed;
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(readAndSetDataToMeters)
return Event.ModelessFormClosed;
else
{
return Event.ModelessFormIsOpen;
}
if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed)
if (readAndSetDataToMeters && !filedDataToMeters)
{
return Event.ModelessFormIsOpen;
if (regReaders != null)
{
//add data into dialog
int item = 0;
TestStartEndForm dlg = (modelessDlg as TestStartEndForm);
foreach (var iRegReader in regReaders)
{
if (iRegReader is PoseidonReader poseidonReader)
{
if (dlg != null)
{
if (currentOp == CurrentOp.ReadDatastream_StartStates)
{
dlg.WMStartState[item] = poseidonReader.BeginWMState;
dlg.WMStartStateStr[item] = poseidonReader.BeginWMState.ToString();
}
if (currentOp == CurrentOp.ReadDatastream_EndStates)
dlg.WMEndState[item] = poseidonReader.EndWMState;
}
}
item++;
}
if (dlg != null)
{
if (dlg.InvokeRequired)
{
dlg.BeginInvoke(new Action(() =>
dlg.UpdateValues(currentOp == CurrentOp.ReadDatastream_StartStates, true)));
}
else
{
dlg.UpdateValues(currentOp == CurrentOp.ReadDatastream_StartStates, true);
}
}
filedDataToMeters = true;
}
}
if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed)
{
return Event.ModelessFormIsOpen; //ModelessFormClosed ??
}
if (!resultSaved) /// This is to save the result only once
@ -290,6 +359,8 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
modelessDlg = null;
}
currentOp = CurrentOp.None;
readAndSetDataToMeters = false;
filedDataToMeters = false;
}
public bool ShowForm
@ -303,13 +374,15 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
get { return entryFormCfg == null ? false : entryFormCfg.SaveCommunication;}
}
//private long GetMaxtime()
public bool ReadAndSetDataToMeters()
{
bool bOperationSuccess = false;
if (currentOp == CurrentOp.SendStartDataStream)
{
bool finishedReading = regReaders == null; // we can work only with register readers
while (!finishedReading)
while (!finishedReading) //TODO BUMI lock - fuck ?
{
bool bAllReadersFinished = true;
foreach (var iRegReader in regReaders )
@ -326,6 +399,7 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
}
/// Send start data stream
poseidonReader.Run();
readDataOp = ReadDataOp.Start;
if (!(poseidonReader.CurrentOp == PoseidonReader.CurrentPoseidonOp.Done
|| poseidonReader.CurrentOp == PoseidonReader.CurrentPoseidonOp.Error))
{
@ -337,10 +411,11 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
if (bAllReadersFinished)
{
finishedReading = true;
readDataOp = ReadDataOp.Done;
}
else
{
System.Threading.Thread.Sleep(100);
System.Threading.Thread.Sleep(10);
}
}
@ -350,7 +425,7 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
|| (currentOp == CurrentOp.ReadDatastream_EndStates))
{
bool finishedReading = regReaders == null; // we can work only with register readers
while (!finishedReading)
while (!finishedReading) //TODO BUMI lock - fuck ?
{
bool bAllReadersFinished = true;
foreach (var iRegReader in regReaders )
@ -383,7 +458,7 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
}
else
{
System.Threading.Thread.Sleep(100);
System.Threading.Thread.Sleep(10);
}
}

View File

@ -89,7 +89,7 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
{
Direction = Direction.Forward_RL;
Orders = Orders.Arbitrary;
ShowDialog = false;
ShowDialog = true;
SaveCommunication = false;
}

View File

@ -99,9 +99,12 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
this.disabled = disabled;
ShuffleTextBoxes();
ResizeDlgToFitEnabledControls();
WMStartState = new double[waterMetersCount];
WMStartStateStr = new string[waterMetersCount];
SetUiBusy(true);
}
/// <summary>
@ -130,8 +133,41 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
this.warningLimHi = 2 * errLimHi;
ShuffleTextBoxes();
ResizeDlgToFitEnabledControls();
WMEndState = new double[waterMetersCount];
SetUiBusy(true);
}
private void SetUiBusy(bool busy, long deltaTime = -1)
{
// show wait cursor for form and children
this.UseWaitCursor = busy;
// block editing textboxes
for (int i = 0; i < enabledTextBoxes.Count; i++)
{
enabledTextBoxes[i].ReadOnly = busy;
}
// disable buttons while busy
if (okButton != null) okButton.Enabled = !busy;
// show/hide "loading..." label
if (loadingLabel != null)
{
loadingLabel.Visible = busy;
loadingLabel.Text = "Loading...";
if (deltaTime > 0)
{
//show delta time in label
loadingLabel.Visible = true;
loadingLabel.Text = string.Format("Get: {0} s", deltaTime/1000.0);
}
}
}
/// <summary>
@ -159,6 +195,43 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
TextBoxesCount = TBF.Data.WMsCount;
}
}
void ResizeDlgToFitEnabledControls()
{
int xMax = 0;
int yMax = 0;
GetMaxDimensions(startTextBoxes,WaterMetersCount,ref xMax, ref yMax);
GetMaxDimensions(endTextBoxes,WaterMetersCount, ref xMax, ref yMax);
int shapeGap = 50;
okButton.Left = xMax + shapeGap;
xMax = okButton.Left + okButton.Width;
Width = xMax + shapeGap;
Height = yMax + shapeGap;
}
private void GetMaxDimensions(TextBox[] textBoxes, int waterMetersCount, ref int xMax, ref int yMax)
{
for (int i = 0; i < waterMetersCount; i++)
{
if (textBoxes[i].Left + textBoxes[i].Width > xMax)
xMax = textBoxes[i].Left + textBoxes[i].Width;
if (textBoxes[i].Top + textBoxes[i].Height > yMax)
yMax = textBoxes[i].Top + textBoxes[i].Height;
}
}
// private void GetMaxDimensions(TextBox[] textBoxes, ref int xMax, ref int yMax)
// {
// for (int i = 0; i < textBoxes.Length; i++)
// {
// if(!textBoxes[i].Visible)
// continue;
// if (textBoxes[i].Left + textBoxes[i].Width > xMax) xMax = textBoxes[i].Left + textBoxes[i].Width;
// if (textBoxes[i].Top + textBoxes[i].Height > yMax) yMax = textBoxes[i].Top + textBoxes[i].Height;
// }
// }
private void CycleEndForm_Load(object sender, EventArgs e)
{
@ -211,6 +284,41 @@ namespace TBF.Rig.DataEntry.PoseidonCmd
}
}
public void UpdateValues(bool stratValue = true, bool enableEdit = false, long deltaTime = -1)
{
// Ensure we are on the UI thread
if (InvokeRequired)
{
BeginInvoke(new Action(() => UpdateValues(stratValue, enableEdit)));
return;
}
for (int i = 0; i < TextBoxesCount; i++)
{
if (stratValue)
{
if (WMStartStateStr != null && i < WMStartStateStr.Length)
{
startTextBoxes[i].Text = WMStartStateStr[i];
}
}
else
{
// small bugfix: check WMEndState, not WMStartStateStr
if ((WMEndState != null && i < WMEndState.Length) &&
(WMStartStateStr != null && i < WMStartStateStr.Length && WMStartStateStr[i] != ""))
{
endTextBoxes[i].Text = WMEndState[i].ToString();
}
}
}
if (enableEdit)
SetUiBusy(false, deltaTime);
// if you also need to enable/disable editing, do it here,
// it's now safely on the UI thread.
}
void Localize()
{
Text = Strings.Water_Meter_States;

File diff suppressed because it is too large Load Diff

View File

@ -326,8 +326,12 @@ namespace TBF.Rig.RegisterReaders.PoseidonCmdStartStop
/// <summary>
/// for debug purposes what time will consume answer
/// </summary>
private long startTimeInMilis, fullTimeInMilis;
private static long SafetyTimeOut = 30 * 1000; /// 30 seconds
private long startTimeInMilis = -1, fullTimeInMilis = -1;
private static long SafetyTimeOut = 30 * 1000;
/// 30 seconds
public long DeltaTime { get{return fullTimeInMilis;}}
/// <summary>Run this operation</summary>
/// <returns>eventDone</returns>

View File

@ -210,6 +210,7 @@ namespace TBF.Rig
new TestMethods.StandingStartMassCollection.Single.Factory(),
new TestMethods.StandingStartMassCollection.Compound.Factory(),
new TestMethods.StandingStartMassCollection.HeatMeters.Factory(),
new TestMethods.StandingStartMassCollectionPoseidon.Single.Factory(),
new TestMethods.StandingStartMassCollectionAdvance.Single.Factory(),
new TestMethods.StandingStartMassCollectionAdvance.Compound.Factory(),
new TestMethods.StandingStartMassCollectionAdvance.HeatMeters.Factory(),