Add auto-read serial number and auto-close gap support:

- Introduce `bAutoRead` and `iAutocloseGap` fields for serial number auto-read and delay-based form auto-close.
- Update constructors and methods in `CycleBgEnForm`, `TestStartEndForm`, and related classes to handle new functionality.
- Refactor serial number reading logic to improve maintainability.
- Extend configuration (`EntryFormCfg`) for new auto-read and auto-close options.
- Update `AssemblyVersion` and `AssemblyFileVersion` to `3.9.2218.1`.
This commit is contained in:
Michal Buzik 2026-03-03 10:25:31 +01:00
parent 2fc64e478d
commit 47eef34694
6 changed files with 224 additions and 129 deletions

View File

@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("3.9.2215.1")]
[assembly: AssemblyFileVersion("3.9.2015.1")]
[assembly: AssemblyVersion("3.9.2218.1")]
[assembly: AssemblyFileVersion("3.9.2018.1")]

View File

@ -54,6 +54,16 @@ namespace TBF.Rig.DataEntry.Uni
readonly CheckBox[] checkBoxes; /// Check boxes for water meter enable/disable
///
bool readSerialNoByRegisterReader = true;
/// <summary>
/// automaticly read serial number from register reader
/// </summary>
bool bAutoRead;
///<summary>
///autoclose disabled by default, if > 0 is enabled
/// - in seconds
/// </summary>
int iAutocloseGap;
readonly MultiPurposeBtnFunction multiPurposeButtonFn;
bool multiPurposeButtonFlag;
@ -92,7 +102,7 @@ namespace TBF.Rig.DataEntry.Uni
/// <param name="colItems">Water meter items displayed in columns (in the matrix in the main part of the form)</param>
/// <param name="isEnd">true = This form is displayed at the end of cycle</param>
public CycleBgEnForm(IList<WaterMeter> waterMeters, int _lineSize, string title, FontSz sz, bool isLrOrder, bool isCameraPicture,
string formCloseKeys, IList<DEItem> commonItems, IList<DEItem> colItems, bool isEnd = false)
string formCloseKeys, IList<DEItem> commonItems, IList<DEItem> colItems, bool AutoRead, int AutoCloseGap, bool isEnd = false)
: this()
{
/// Arguments
@ -106,6 +116,9 @@ namespace TBF.Rig.DataEntry.Uni
this.colItems = colItems;
this.isEnd = isEnd;
this.bAutoRead = AutoRead;
this.iAutocloseGap = AutoCloseGap; //autoclose disabled by default, if > 0 is enabled
/// Preserve column items for use in SummaryResults
if (!isEnd)
{
@ -426,11 +439,14 @@ namespace TBF.Rig.DataEntry.Uni
}
}
public CycleBgEnForm(IList<WaterMeter> waterMeters, IRegReader[] regReaders, int title, string myCfgBgTitle, FontSz myCfgBgSize, bool myCfgBgIsLrOrder, bool myCfgBgIsCameraPicture, string myCfgBgFormCloseKeys, IList<DEItem> getItems, IList<DEItem> getColumns, bool b, IRegReader[] iRegReaders)
: this(waterMeters, title, myCfgBgTitle, myCfgBgSize, myCfgBgIsLrOrder, myCfgBgIsCameraPicture, myCfgBgFormCloseKeys, getItems, getColumns, b)
public CycleBgEnForm(IList<WaterMeter> waterMeters, IRegReader[] regReaders, int title, string myCfgBgTitle, FontSz myCfgBgSize, bool myCfgBgIsLrOrder, bool myCfgBgIsCameraPicture, string myCfgBgFormCloseKeys, IList<DEItem> getItems, IList<DEItem> getColumns, bool b, IRegReader[] iRegReaders, bool AutoRead, int AutoCloseGap)
: this(waterMeters, title, myCfgBgTitle, myCfgBgSize, myCfgBgIsLrOrder, myCfgBgIsCameraPicture, myCfgBgFormCloseKeys, getItems, getColumns,AutoRead,AutoCloseGap, b)
{
this.regReaders = regReaders;
if (bAutoRead)
{
ReadAndProcessSerialNumbersByRegReader();
}
}
/// <summary>
@ -704,26 +720,11 @@ namespace TBF.Rig.DataEntry.Uni
char[] digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
if (readSerialNoByRegisterReader)
{
log.Debug("Reading serial numbers from register readers...");
this.SerialNumberRead += (s, eArgs) =>
{
log.Debug("Serial updated: " + eArgs.SerialNumber);
UpdateSomethingBySerial(eArgs.Reader, eArgs.SerialNumber);
};
BeforeUpdate();
this.DoneUpdateBySerial += (s, eArgs) =>
{
log.Debug("Serial updated DONE!");
DoneUpdate();
};
ReadSerialNumbersAsync(regReaders);
}
else
// if (readSerialNoByRegisterReader)
// {
// Task.Run(() => ReadAndProcessSerialNumbersByRegReader());
// }
// else
{
///
/// Find a column with serial numbers
@ -809,6 +810,25 @@ namespace TBF.Rig.DataEntry.Uni
}
}
private void ReadAndProcessSerialNumbersByRegReader()
{
log.Debug("Reading serial numbers from register readers...");
this.SerialNumberRead += (s, eArgs) =>
{
log.Debug("Serial updated: " + eArgs.SerialNumber);
UpdateSomethingBySerial(eArgs.Reader, eArgs.SerialNumber);
};
BeforeUpdate();
this.DoneUpdateBySerial += (s, eArgs) =>
{
log.Debug("Serial updated DONE!");
DoneUpdate();
};
ReadSerialNumbersAsync(regReaders);
}
private void UpdateSomethingBySerial(IRegReader eReader, string eSerialNumber)
{
log.Debug($"RegReader name: {eReader.Name}, Serial No updated: " + eSerialNumber);
@ -840,19 +860,57 @@ namespace TBF.Rig.DataEntry.Uni
_previousCursor = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
//Enable all checkboxes
for (int firstIx = 0; firstIx < wmsCount; firstIx++)
{
checkBoxes[firstIx].Checked = true;
}
}
private void DoneUpdate()
{
log.Debug("DoneUpdate");
//enbale only found checkboxes
int comboRows = comboBoxes.GetLength(0);
int comboCols = comboBoxes.GetLength(1);
for (int k = 0; k < colItems.Count && k < comboRows; k++)
{
for (int ix = 0; ix < wmsCount && ix < comboCols; ix++)
{
bool letEnable = false;
var combo = comboBoxes[k, ix];
if (combo != null)
{
letEnable = !string.IsNullOrEmpty(combo.Text);
}
if (letEnable && checkBoxes.Length > ix)
{
checkBoxes[ix].Enabled = true;
}
}
}
this.okButton.Enabled = GetStoredOrDefault("okButton");
this.clearButton.Enabled = GetStoredOrDefault("clearButton");
this.multiPurposeButton.Enabled = GetStoredOrDefault("multiPurposeButton");
Cursor.Current = _previousCursor;
//if (ShowDialogType == ShowDialogType.ContinueAutomatically)
//{
AutoClickOkAfterDelay();
//}
if (iAutocloseGap > 0)
{
AutoClickOkAfterDelay(iAutocloseGap * 1000);
}
}
private void PopulateComboBoxWithSerialNumbers( IRegReader eReader, string eSerialNumber)
@ -1084,7 +1142,20 @@ namespace TBF.Rig.DataEntry.Uni
public async void ReadSerialNumbersAsync(IEnumerable<IRegReader> regReaders)
{
log.Debug("Reading serial numbers from register readers...");
log.Debug($"Reading-> regReaders.length({(regReaders != null ? regReaders.Count() : 0)})");
if (regReaders == null)
{
log.Debug("Reading-> regReaders is null");
return;
}
foreach (IRegReader reader in regReaders)
{
if (reader == null) continue;
log.Debug($"Reading-> regReader: {reader.GetType().Name}");
}
try
{
@ -1093,6 +1164,9 @@ namespace TBF.Rig.DataEntry.Uni
.GroupBy(r => r.Group)
.OrderBy(g => g.Key);
if (groups != null)
log.Debug($"Reading-> groups.length({groups.Count()})");
foreach (var group in groups)
{
var subGroups = group

View File

@ -41,8 +41,10 @@ namespace TBF.Rig.DataEntry.Uni
public bool BgIsLrOrder; /// 5
public bool BgIsCameraPicture; /// 6
public string BgFormCloseKeys; /// 7
public bool BgIsAutoReadingSerialNo;/// 8 - new
public int BgAutoCloseGap; /// 9 - new
public bool EnShowForm; /// 8
public bool EnShowForm; /// 8 + 2
public string EnTitle; /// 9
public FontSz EnSize; /// 10
// int EnItemsCount; /// 11
@ -60,7 +62,7 @@ namespace TBF.Rig.DataEntry.Uni
public bool TestIsCameraPicture; /// 22
public string TestStartPicName; /// 23
public string TestEndPicName; /// 24
public string TestFormCloseKeys; /// 25
public string TestFormCloseKeys; /// 25 + 2
public Ct[] BgItemContent; /// 26 + 4 * ix
public string[] BgItemCaption; /// 27 + 4 * ix
@ -343,6 +345,8 @@ namespace TBF.Rig.DataEntry.Uni
BgIsLrOrder = false;
BgIsCameraPicture = false;
BgFormCloseKeys = string.Empty;
BgIsAutoReadingSerialNo = false;
BgAutoCloseGap = 10;
EnShowForm = false;
EnTitle = "Enter water meter data";
@ -389,16 +393,18 @@ namespace TBF.Rig.DataEntry.Uni
string[] paramNames = new string[]
{
"Beginning: Show form",
"Beginning: Form title",
"Beginning: Font ize",
"Beginning: Common items count",
"Beginning: Show form", //0
"Beginning: Form title", //1
"Beginning: Font ize", //2
"Beginning: Common items count",//3
"Beginning: Columns count",
"Beginning: Left-to-right order",
"Beginning: Show camera picture",
"Beginning: Keys to close the form",
"Beginning: Read Automatic Serial No from watermeter", //8
"Beginning: Continue automatic after Read Serial No", //9
"End: Show form",
"End: Show form",//8+2
"End: Form title",
"End: Font size",
"End: Common items count",
@ -508,17 +514,18 @@ namespace TBF.Rig.DataEntry.Uni
case 0:
case 5:
case 6:
case 8:
case 13:
case 14:
case 8: //new auto read SerialNo
case 10: //8+2
case 15:
case 16:
case 20:
case 21:
case 18:
case 22:
case 23:
case 24:
return new string[] { Strings.yes, Strings.no };
case 2:
case 10:
case 18:
case 12:
case 20:
for (FontSz sz = 0; sz < FontSz.Count; sz++) list.Add(sz.ToDescription());
return list;
default:
@ -596,26 +603,28 @@ namespace TBF.Rig.DataEntry.Uni
case 5: return BgIsLrOrder ? Strings.yes : Strings.no;
case 6: return BgIsCameraPicture ? Strings.yes : Strings.no;
case 7: return BgFormCloseKeys;
case 8: return BgIsAutoReadingSerialNo ? Strings.yes : Strings.no;;
case 9: return BgAutoCloseGap.ToString();
case 8: return EnShowForm ? Strings.yes : Strings.no;
case 9: return EnTitle;
case 10: return EnSize.ToDescription();
case 11: return GetEnItemsCount().ToString();
case 12: return GetEnColumnsCount().ToString();
case 13: return EnIsLrOrder ? Strings.yes : Strings.no;
case 14: return EnIsCameraPicture ? Strings.yes : Strings.no;
case 15: return EnFormCloseKeys;
case 10: return EnShowForm ? Strings.yes : Strings.no;
case 11: return EnTitle;
case 12: return EnSize.ToDescription();
case 13: return GetEnItemsCount().ToString();
case 14: return GetEnColumnsCount().ToString();
case 15: return EnIsLrOrder ? Strings.yes : Strings.no;
case 16: return EnIsCameraPicture ? Strings.yes : Strings.no;
case 17: return EnFormCloseKeys;
case 16: return TestStartEndShowForm ? Strings.yes : Strings.no;
case 17: return TestTitle;
case 18: return TestSize.ToDescription();
case 19: return GetTestColumnsCount().ToString();
case 20: return TestStartBoxAlwaysEn ? Strings.yes : Strings.no;
case 21: return TestIsLrOrder ? Strings.yes : Strings.no;
case 22: return TestIsCameraPicture ? Strings.yes : Strings.no;
case 23: return TestStartPicName;
case 24: return TestEndPicName;
case 25: return TestFormCloseKeys;
case 18: return TestStartEndShowForm ? Strings.yes : Strings.no;
case 19: return TestTitle;
case 20: return TestSize.ToDescription();
case 21: return GetTestColumnsCount().ToString();
case 22: return TestStartBoxAlwaysEn ? Strings.yes : Strings.no;
case 23: return TestIsLrOrder ? Strings.yes : Strings.no;
case 24: return TestIsCameraPicture ? Strings.yes : Strings.no;
case 25: return TestStartPicName;
case 26: return TestEndPicName;
case 27: return TestFormCloseKeys;
default: return string.Empty;
}
@ -714,10 +723,12 @@ namespace TBF.Rig.DataEntry.Uni
case 5: BgIsLrOrder = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 6: BgIsCameraPicture = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 7: BgFormCloseKeys = str; return CfgUpdateFlags.RestartRqrd;
case 8: BgIsAutoReadingSerialNo = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 9: BgAutoCloseGap = int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 8: EnShowForm = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 9: EnTitle = str; return CfgUpdateFlags.RestartRqrd;
case 10:
case 10: EnShowForm = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 11: EnTitle = str; return CfgUpdateFlags.RestartRqrd;
case 12:
for (FontSz sz = 0; sz < FontSz.Count; sz++)
{
if (str == sz.ToDescription())
@ -727,15 +738,15 @@ namespace TBF.Rig.DataEntry.Uni
}
}
return CfgUpdateFlags.None;
case 11: SetEnItemsCount(int.Parse(str)); return CfgUpdateFlags.RestartRqrd;
case 12: SetEnColumnsCount(int.Parse(str)); return CfgUpdateFlags.RestartRqrd;
case 13: EnIsLrOrder = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 14: EnIsCameraPicture = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 15: EnFormCloseKeys = str; return CfgUpdateFlags.RestartRqrd;
case 13: SetEnItemsCount(int.Parse(str)); return CfgUpdateFlags.RestartRqrd;
case 14: SetEnColumnsCount(int.Parse(str)); return CfgUpdateFlags.RestartRqrd;
case 15: EnIsLrOrder = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 16: EnIsCameraPicture = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 17: EnFormCloseKeys = str; return CfgUpdateFlags.RestartRqrd;
case 16: TestStartEndShowForm = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 17: TestTitle = str; return CfgUpdateFlags.RestartRqrd;
case 18:
case 18: TestStartEndShowForm = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 19: TestTitle = str; return CfgUpdateFlags.RestartRqrd;
case 20:
for (FontSz sz = 0; sz < FontSz.Count; sz++)
{
if (str == sz.ToDescription())
@ -745,13 +756,13 @@ namespace TBF.Rig.DataEntry.Uni
}
}
return CfgUpdateFlags.None;
case 19: SetTestColumnsCount(int.Parse(str)); return CfgUpdateFlags.RestartRqrd;
case 20: TestStartBoxAlwaysEn = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 21: TestIsLrOrder = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 22: TestIsCameraPicture = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 23: TestStartPicName = str; return CfgUpdateFlags.RestartRqrd;
case 24: TestEndPicName = str; return CfgUpdateFlags.RestartRqrd;
case 25: TestFormCloseKeys = str; return CfgUpdateFlags.RestartRqrd;
case 21: SetTestColumnsCount(int.Parse(str)); return CfgUpdateFlags.RestartRqrd;
case 22: TestStartBoxAlwaysEn = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 23: TestIsLrOrder = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 24: TestIsCameraPicture = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd;
case 25: TestStartPicName = str; return CfgUpdateFlags.RestartRqrd;
case 26: TestEndPicName = str; return CfgUpdateFlags.RestartRqrd;
case 27: TestFormCloseKeys = str; return CfgUpdateFlags.RestartRqrd;
default:
return CfgUpdateFlags.None;
@ -872,34 +883,36 @@ namespace TBF.Rig.DataEntry.Uni
case 2:
case 5:
case 6:
case 8:
case 10:
case 13:
case 14:
case 8://Auto close - yes/No
case 10://8+2
case 12:
case 15:
case 16:
case 18:
case 20:
case 21:
case 22:
case 23:
case 24:
message = string.Empty;
if (ParamValues(i).Contains(str)) return true;
break;
case 3:
case 4:
case 11:
case 12:
case 19:
case 9: //Gap AutoClose
case 13:
case 14:
case 21:
message = string.Empty;
if (int.TryParse(str, out idummy)) return true;
break;
case 1:
case 7:
case 9:
case 15:
case 11:
case 17:
case 23:
case 24:
case 19:
case 25:
case 26:
case 27:
message = string.Empty;
return true;
default:
@ -942,6 +955,8 @@ namespace TBF.Rig.DataEntry.Uni
prms.BgIsLrOrder = BgIsLrOrder;
prms.BgIsCameraPicture = BgIsCameraPicture;
prms.BgFormCloseKeys = BgFormCloseKeys;
prms.BgIsAutoReadingSerialNo = BgIsAutoReadingSerialNo;
prms.BgAutoCloseGap = BgAutoCloseGap;
prms.EnShowForm = EnShowForm;
prms.EnTitle = EnTitle;

View File

@ -239,12 +239,12 @@ namespace TBF.Rig.DataEntry.Uni
if (regReaders != null)
{
modelessDlg = new CycleBgEnForm(waterMeters, regReaders, TBF.Data.LineSize, myCfg.BgTitle, myCfg.BgSize, myCfg.BgIsLrOrder, myCfg.BgIsCameraPicture,
myCfg.BgFormCloseKeys, DEItem.GetItems(), DEItem.GetColumns(), false, regReaders);
myCfg.BgFormCloseKeys, DEItem.GetItems(), DEItem.GetColumns(), false, regReaders, myCfg.BgIsAutoReadingSerialNo, myCfg.BgAutoCloseGap);
}
else
{
modelessDlg = new CycleBgEnForm(waterMeters, TBF.Data.LineSize, myCfg.BgTitle, myCfg.BgSize, myCfg.BgIsLrOrder, myCfg.BgIsCameraPicture,
myCfg.BgFormCloseKeys, DEItem.GetItems(), DEItem.GetColumns(), false);
myCfg.BgFormCloseKeys, DEItem.GetItems(), DEItem.GetColumns(), myCfg.BgIsAutoReadingSerialNo, myCfg.BgAutoCloseGap, false);
}
modelessDlg.Show();
}
@ -273,7 +273,7 @@ namespace TBF.Rig.DataEntry.Uni
}
modelessDlg = new CycleBgEnForm(waterMeters, TBF.Data.LineSize, myCfg.EnTitle, myCfg.EnSize, myCfg.EnIsLrOrder, myCfg.EnIsCameraPicture,
myCfg.EnFormCloseKeys, DEItem.GetItems(), DEItem.GetColumns(), true);
myCfg.EnFormCloseKeys, DEItem.GetItems(), DEItem.GetColumns(), myCfg.BgIsAutoReadingSerialNo, myCfg.BgAutoCloseGap, true);
modelessDlg.Show();
}
///
@ -295,7 +295,8 @@ namespace TBF.Rig.DataEntry.Uni
modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize,
myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys,
DEItem.GetColumns(), isCompound, volumeUnit, myCfg.TestIsCameraPicture,
startImages, endImages, ocr, ocrMessage, myRef.OcrStream);
startImages,endImages, ocr, ocrMessage, myRef.OcrStream,
myCfg.BgIsAutoReadingSerialNo, myCfg.BgAutoCloseGap);
modelessDlg.Show();
}
///
@ -317,7 +318,7 @@ namespace TBF.Rig.DataEntry.Uni
modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize,
myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(),
isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages,
ocr, ocrMessage, myRef.OcrStream, wmStartStateStr, refVolume, errLimLo, errLimHi);
ocr, ocrMessage, myRef.OcrStream, myCfg.BgIsAutoReadingSerialNo, myCfg.BgAutoCloseGap, wmStartStateStr, refVolume, errLimLo, errLimHi);
modelessDlg.Show();
}
///
@ -339,7 +340,7 @@ namespace TBF.Rig.DataEntry.Uni
modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize,
myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(),
isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages,
ocr, ocrMessage, myRef.OcrStream, wmStartStateStr, refVolume, errLimLo, errLimHi);
ocr, ocrMessage, myRef.OcrStream, myCfg.BgIsAutoReadingSerialNo,myCfg.BgAutoCloseGap, wmStartStateStr, refVolume, errLimLo, errLimHi);
modelessDlg.Show();
}
///

View File

@ -63,6 +63,17 @@ namespace TBF.Rig.DataEntry.Uni
readonly double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo
readonly double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi
private bool _readDataFromRegReaders = true;
/// <summary>
/// automaticly read serial number from register reader
/// </summary>
bool bAutoRead;
///<summary>
///autoclose disabled by default, if > 0 is enabled
/// - in seconds
/// </summary>
int iAutocloseGap;
/// Derived from arguments in the constructor
readonly bool isEnd;
readonly Tst mode; /// Start, End or Deferred
@ -156,7 +167,7 @@ namespace TBF.Rig.DataEntry.Uni
public TestStartEndForm(IList<WaterMeter> waterMeters, IRegReader[] regReaders, int _lineSize, string title, FontSz sz,
bool isStartBoxAlwaysEn, bool isLrOrder, string formCloseKeys, IList<DEItem> colItems, bool isCompound,
Unit initialVolumeUnit, bool isCameraPicture, string[] startImages, string[] endImages,
OcrVidi ocrVidi, string ocrMessage, string streamName, string[] wmStartStateStr = null,
OcrVidi ocrVidi, string ocrMessage, string streamName, bool bAutoRead, int iAutocloseGap, string[] wmStartStateStr = null,
double refVolume = 0, double errLimLo = 0, double errLimHi = 0)
: this()
{
@ -181,6 +192,8 @@ namespace TBF.Rig.DataEntry.Uni
this.refVolume = refVolume;
this.warningLimLo = 2 * errLimLo;
this.warningLimHi = 2 * errLimHi;
this.bAutoRead = bAutoRead;
this.iAutocloseGap = iAutocloseGap;
if (waterMeters == null || regReaders == null ||
(wmStartStateStr != null && wmStartStateStr.Length != (isCompound ? 2 : 1) * waterMeters.Count))
@ -570,7 +583,7 @@ namespace TBF.Rig.DataEntry.Uni
}
if (_readDataFromRegReaders)
if (bAutoRead)
{
log.Debug($"Reading serial numbers from register readers... IsEnd: {isEnd}");
this.VolumeStartReadbyRegReader += (s, eArgs) =>
@ -630,10 +643,10 @@ namespace TBF.Rig.DataEntry.Uni
this.unitComboBox.Enabled = GetStoredOrDefault("unitComboBox");
Cursor.Current = _previousCursor;
//if (ShowDialogType == ShowDialogType.ContinueAutomatically)
//{
if (iAutocloseGap > 0)
{
AutoClickOkAfterDelay();
//}
}
}
public void UpdateVolume(IRegReader eArgsReader, double eArgsVolume)
@ -667,40 +680,30 @@ namespace TBF.Rig.DataEntry.Uni
: new List<Ct> { Ct.StartState, Ct.StartStateAux };
double VolumeRaw = eArgsVolume;
double v = eArgsVolume;
// Test and compensate roll over
if (isEnd)
{
if (eArgsReader != null && (!Double.IsNaN(eArgsReader.BeginWMState)))
{
double lastMod = eArgsReader.BeginWMState % VOL_RANGE_LITERS;
if (lastMod < 0) lastMod += VOL_RANGE_LITERS;
double delta = v - lastMod;
// choose the shortest jump across the modulo boundary
if (delta < -VOL_RANGE_LITERS / 2.0) delta += VOL_RANGE_LITERS;
else if (delta > VOL_RANGE_LITERS / 2.0) delta -= VOL_RANGE_LITERS;
VolumeRaw = eArgsReader.BeginWMState + delta;
log.Debug($"Roll over detected: {eArgsReader.Name} - {eArgsReader.BeginWMState} -> {VolumeRaw}");
if (eArgsReader.BeginWMState > VolumeRaw) //Do RollOver
{
VolumeRaw = eArgsVolume + VOL_RANGE_LITERS;
log.Debug(
$"Roll over detected: {eArgsReader.Name} - {eArgsReader.BeginWMState} -> {VolumeRaw}");
}
}
else
{
//volume from form
Double beginVolume = findBeginStateFromForm();
double lastMod = beginVolume % VOL_RANGE_LITERS;
if (lastMod < 0) lastMod += VOL_RANGE_LITERS;
double delta = v - lastMod;
// choose the shortest jump across the modulo boundary
if (delta < -VOL_RANGE_LITERS / 2.0) delta += VOL_RANGE_LITERS;
else if (delta > VOL_RANGE_LITERS / 2.0) delta -= VOL_RANGE_LITERS;
VolumeRaw = beginVolume + delta;
log.Debug($"Roll over detected: {eArgsReader.Name} - {eArgsReader.BeginWMState} -> {VolumeRaw}");
if (beginVolume > VolumeRaw) //Do RollOver
{
VolumeRaw = eArgsVolume + VOL_RANGE_LITERS;
log.Debug(
$"Begin from Form! Roll over detected: {eArgsReader.Name} - {beginVolume} -> {VolumeRaw}");
}
}
}
@ -1392,7 +1395,7 @@ namespace TBF.Rig.DataEntry.Uni
Font largeFont = new Font("arial", 24.0F, FontStyle.Bold); /// normal image
Font smallFont = new Font("arial", 12.0F, FontStyle.Bold);
private bool _readDataFromRegReaders = true;
/// zoomed image

View File

@ -78,6 +78,8 @@ namespace TBFTests.Rig.DataEntry.Uni
ocrVidi: null,
ocrMessage: "",
streamName: "",
bAutoRead: false,
iAutocloseGap: 0,
wmStartStateStr: wmStartStateStr,
refVolume: 0,
errLimLo: 0,