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 // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("3.9.2215.1")] [assembly: AssemblyVersion("3.9.2218.1")]
[assembly: AssemblyFileVersion("3.9.2015.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 readonly CheckBox[] checkBoxes; /// Check boxes for water meter enable/disable
/// ///
bool readSerialNoByRegisterReader = true; 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; readonly MultiPurposeBtnFunction multiPurposeButtonFn;
bool multiPurposeButtonFlag; 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="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> /// <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, 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() : this()
{ {
/// Arguments /// Arguments
@ -105,6 +115,9 @@ namespace TBF.Rig.DataEntry.Uni
this.commonItems = commonItems; this.commonItems = commonItems;
this.colItems = colItems; this.colItems = colItems;
this.isEnd = isEnd; this.isEnd = isEnd;
this.bAutoRead = AutoRead;
this.iAutocloseGap = AutoCloseGap; //autoclose disabled by default, if > 0 is enabled
/// Preserve column items for use in SummaryResults /// Preserve column items for use in SummaryResults
if (!isEnd) 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) 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, b) : this(waterMeters, title, myCfgBgTitle, myCfgBgSize, myCfgBgIsLrOrder, myCfgBgIsCameraPicture, myCfgBgFormCloseKeys, getItems, getColumns,AutoRead,AutoCloseGap, b)
{ {
this.regReaders = regReaders; this.regReaders = regReaders;
if (bAutoRead)
{
ReadAndProcessSerialNumbersByRegReader();
}
} }
/// <summary> /// <summary>
@ -704,26 +720,11 @@ namespace TBF.Rig.DataEntry.Uni
char[] digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; char[] digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
if (readSerialNoByRegisterReader) // if (readSerialNoByRegisterReader)
{ // {
log.Debug("Reading serial numbers from register readers..."); // Task.Run(() => ReadAndProcessSerialNumbersByRegReader());
this.SerialNumberRead += (s, eArgs) => // }
{ // else
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
{ {
/// ///
/// Find a column with serial numbers /// 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) private void UpdateSomethingBySerial(IRegReader eReader, string eSerialNumber)
{ {
log.Debug($"RegReader name: {eReader.Name}, Serial No updated: " + eSerialNumber); log.Debug($"RegReader name: {eReader.Name}, Serial No updated: " + eSerialNumber);
@ -840,19 +860,57 @@ namespace TBF.Rig.DataEntry.Uni
_previousCursor = Cursor.Current; _previousCursor = Cursor.Current;
Cursor.Current = Cursors.WaitCursor; Cursor.Current = Cursors.WaitCursor;
//Enable all checkboxes
for (int firstIx = 0; firstIx < wmsCount; firstIx++)
{
checkBoxes[firstIx].Checked = true;
}
} }
private void DoneUpdate() private void DoneUpdate()
{ {
log.Debug("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.okButton.Enabled = GetStoredOrDefault("okButton");
this.clearButton.Enabled = GetStoredOrDefault("clearButton"); this.clearButton.Enabled = GetStoredOrDefault("clearButton");
this.multiPurposeButton.Enabled = GetStoredOrDefault("multiPurposeButton"); this.multiPurposeButton.Enabled = GetStoredOrDefault("multiPurposeButton");
Cursor.Current = _previousCursor; Cursor.Current = _previousCursor;
//if (ShowDialogType == ShowDialogType.ContinueAutomatically) if (iAutocloseGap > 0)
//{ {
AutoClickOkAfterDelay(); AutoClickOkAfterDelay(iAutocloseGap * 1000);
//} }
} }
private void PopulateComboBoxWithSerialNumbers( IRegReader eReader, string eSerialNumber) private void PopulateComboBoxWithSerialNumbers( IRegReader eReader, string eSerialNumber)
@ -1084,7 +1142,20 @@ namespace TBF.Rig.DataEntry.Uni
public async void ReadSerialNumbersAsync(IEnumerable<IRegReader> regReaders) 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 try
{ {
@ -1092,6 +1163,9 @@ namespace TBF.Rig.DataEntry.Uni
.OfType<IRegReaderSmart>() .OfType<IRegReaderSmart>()
.GroupBy(r => r.Group) .GroupBy(r => r.Group)
.OrderBy(g => g.Key); .OrderBy(g => g.Key);
if (groups != null)
log.Debug($"Reading-> groups.length({groups.Count()})");
foreach (var group in groups) foreach (var group in groups)
{ {

View File

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

View File

@ -239,12 +239,12 @@ namespace TBF.Rig.DataEntry.Uni
if (regReaders != null) if (regReaders != null)
{ {
modelessDlg = new CycleBgEnForm(waterMeters, regReaders, TBF.Data.LineSize, myCfg.BgTitle, myCfg.BgSize, myCfg.BgIsLrOrder, myCfg.BgIsCameraPicture, 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 else
{ {
modelessDlg = new CycleBgEnForm(waterMeters, TBF.Data.LineSize, myCfg.BgTitle, myCfg.BgSize, myCfg.BgIsLrOrder, myCfg.BgIsCameraPicture, 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(); 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, 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(); modelessDlg.Show();
} }
/// ///
@ -295,7 +295,8 @@ namespace TBF.Rig.DataEntry.Uni
modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize, modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize,
myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys,
DEItem.GetColumns(), isCompound, volumeUnit, myCfg.TestIsCameraPicture, DEItem.GetColumns(), isCompound, volumeUnit, myCfg.TestIsCameraPicture,
startImages, endImages, ocr, ocrMessage, myRef.OcrStream); startImages,endImages, ocr, ocrMessage, myRef.OcrStream,
myCfg.BgIsAutoReadingSerialNo, myCfg.BgAutoCloseGap);
modelessDlg.Show(); modelessDlg.Show();
} }
/// ///
@ -317,7 +318,7 @@ namespace TBF.Rig.DataEntry.Uni
modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize, modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize,
myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(), myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(),
isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, 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(); modelessDlg.Show();
} }
/// ///
@ -339,7 +340,7 @@ namespace TBF.Rig.DataEntry.Uni
modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize, modelessDlg = new TestStartEndForm(waterMeters, myRef.regReaders, TBF.Data.LineSize, myCfg.TestTitle, myCfg.TestSize,
myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(), myCfg.TestStartBoxAlwaysEn, myCfg.TestIsLrOrder, myCfg.TestFormCloseKeys, DEItem.GetColumns(),
isCompound, volumeUnit, myCfg.TestIsCameraPicture, startImages, endImages, 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(); modelessDlg.Show();
} }
/// ///

View File

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

View File

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