FM2014: - verbose message output

This commit is contained in:
Thomas Wiedebusch 2026-02-20 19:43:49 +01:00
parent 4f1e9d94f5
commit 2da5fd6f10
2 changed files with 131 additions and 92 deletions

View File

@ -232,7 +232,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// <summary>
/// Marker if broadcast connection was last communication
/// </summary>
private static CmdType SharedCmdTypeReminderLastCmd { get; set; }
public static CmdType SharedCmdTypeReminderLastCmd { get; set; }
/// <summary>
/// Reminder of last individual address of FM2014 to initiate a new communication to another device.
@ -284,6 +284,11 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
}
}
/// <summary>
/// The broadcast FM2014 will be used to dispatch the address 0 on the <see cref="OnRawRecordReceived"/>
/// </summary>
private static FM2014 BroadcastFm2014 { get; set; }
#endregion ---------------------------------------- static properties -----------------------------------------
#region ------------------------------------------- object properties -----------------------------------------
@ -699,7 +704,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// - It is a broadcast command which will reset all connected devices!
/// </summary>
/// <returns></returns>
/// <remarks date="2026-Jan-12..Feb-10" author="Thomas Wiedebusch">
/// <remarks date="2026-Jan-12..Feb-20" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public static Boolean ResetHardwareAllDevices()
@ -707,8 +712,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
if (SharedCyclicMeasSequ == CyclicMeasSequ.idle)
return true;
var firstActiveFm2014 = GetFirstConnectedAndLoggedInFm2014();
if (firstActiveFm2014 == null)
if (BroadcastFm2014 == null)
return false;
// Exit tasks
@ -722,7 +726,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
{
// Reset measurement
var infoStr = GetCmdInfo(CmdName.CmdResetMeasurement);
if (!Write(CmdName.CmdResetMeasurement, firstActiveFm2014))
if (!Write(CmdName.CmdResetMeasurement, BroadcastFm2014))
return;
// Wait until FM2014 calibration finished
@ -734,10 +738,10 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
// Change the SI unit to ms instead of seconds
var response = new CmdResponse(CmdName.CmdResetMeasurement, infoStr, (UInt32)resetDelayCtr_ms,
unit: "m" + Units.GetInfo(Units.Name.TIME_s));
PublishResponse(firstActiveFm2014, new ProcessExecEventArgs("",
actualProcessMessage: infoStr,
actualProcessPercent: ActualProcessProgress_percent,
specificInfoObj: response));
PublishResponse(BroadcastFm2014, new ProcessExecEventArgs("",
actualProcessMessage: infoStr,
actualProcessPercent: ActualProcessProgress_percent,
specificInfoObj: response));
Thread.Sleep(loopTime_ms);
resetDelayCtr_ms -= loopTime_ms;
ActualProcessProgress++;
@ -1452,7 +1456,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
SharedCyclicMeasSequ = CyclicMeasSequ.timeMeasurement;
// Set up the progress maximal counter value base on required pulses for REF or DUT
InitActualProcessProgress(refPulsesRequired != null ? (Int32)firstActiveFm2014.RefPulsesRequired :
InitActualProcessProgress(refPulsesRequired != null ? (Int32)firstActiveFm2014.RefPulsesRequired :
(Int32)firstActiveFm2014.DutPulsesRequired, disableWriteReadIncrease: true);
do
@ -1600,8 +1604,8 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
// Is converting to a real time in seconds
if (fm2014.RefTimeMeasured_s > 0.0)
{
fm2014.DutToRefToleranceMeasured_percent =
(1.0 - fm2014.DutTimeMeasured_s / fm2014.RefTimeMeasured_s) * 100.0;
fm2014.DutToRefToleranceMeasured_percent =
(1.0 - fm2014.DutTimeMeasured_s / fm2014.RefTimeMeasured_s) * 100.0;
// Check the threshold for OOR
if (fm2014.DutToRefToleranceMeasured_percent >
@ -1763,13 +1767,14 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// - If the dataObj is a string, this is going to be sent as is (e.g. "1000K2"),
/// - If the dataObj is an UInt16 or Byte this will be assembled with the command code (e.g. "3T"),
/// - Every 'Write' is a string delimited here with 'CR',
/// - If the broadcast address will be used, the <see cref="BroadcastFm2014"/> will be published for logging,
/// - An exception has to be caught by the caller.
/// </summary>
/// <param name="cmdName"></param>
/// <param name="fm2014"></param>
/// <param name="dataObj"></param>
/// <returns></returns>
/// <remarks date="2026-Jan-12..Feb-14" author="Thomas Wiedebusch">
/// <remarks date="2026-Jan-12..Feb-20" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private static Boolean Write(CmdName cmdName, FM2014 fm2014, Object dataObj = null)
@ -1799,12 +1804,10 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
else
{
if (ReminderLastIndividualCommFm2014Address != fm2014.Address ||
SharedCmdTypeReminderLastCmd != CmdType.individual ||
SharedCmdTypeReminderLastCmd != CmdType.individual)
{
retVal = InitiateIndividualComm(fm2014);
if (retVal)
ReminderLastIndividualCommFm2014Address = fm2014.Address;
if (retVal) ReminderLastIndividualCommFm2014Address = fm2014.Address;
}
}
@ -1854,7 +1857,9 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
}
var statusReturn = retVal ? StatusReturn.Okay : StatusReturn.Failed;
ResponseEvent(fm2014, response, statusReturn);
// Dispatch broadcast address if not individual communication
var actualFm2014 = CmdType.broadcast == GetCmdType(cmdName) ? BroadcastFm2014 : fm2014;
ResponseEvent(actualFm2014, response, statusReturn);
return retVal;
}
@ -2009,6 +2014,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
RegisteredFm2014s = null;
SharedSerialPort?.Dispose();
SharedSerialPort = null;
BroadcastFm2014 = null;
}
#endregion ---------------------------------------- static methods --------------------------------------------
@ -2265,6 +2271,18 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
SharedSerialPort.ReadTimeout = 1000;
SharedSerialPort.WriteTimeout = 1000;
}
// The brodcast FM2014 is used to deliver a message to the GUI
if (BroadcastFm2014 == null)
{
BroadcastFm2014 = new FM2014
{
Address = 0
};
// Capture the event of the first connected FM2014
BroadcastFm2014.OnRawRecordReceived = OnRawRecordReceived;
}
var cmdName = CmdName.CmdSerialNumber;
try
{

View File

@ -34,9 +34,9 @@ using Xylem.Common.Utils.ProcessExec.EventArguments;
using CheckBox = System.Windows.Controls.CheckBox;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using Label = System.Windows.Controls.Label;
using Properties = Sensus.Ui.Fm2014TestBench.Properties;
using TextBox = System.Windows.Controls.TextBox;
using UserControl = System.Windows.Controls.UserControl;
using static Sensus.Ui.Fm2014TestBench.Properties.Resources;
namespace Sensus.Ui.FM2014TestBench
{
@ -170,6 +170,9 @@ namespace Sensus.Ui.FM2014TestBench
// Hide button to avoid stress to EEPROM of FM2014
private readonly Boolean _displayBtnSaveSetupToFm2014 = false;
// Reminder for the last address of received message for separator mark between two devices
private Int32 _lastAddressReceived;
#endregion ---------------------------------------- Properties ------------------------------------------------
#region ------------------------------------------- FormControls ----------------------------------------------
/// <summary>
@ -577,12 +580,12 @@ namespace Sensus.Ui.FM2014TestBench
cbxProgramComPort.Text = cbxProgramComPort.Items[_comPortIdx]?.ToString();
// Dispatch multilingual denotation to GUI elements
btnFM2014Connect.Content = Properties.Resources.StrBtnConnect;
btnFM2014Connect.Content = StrBtnConnect;
// Measurement selection tab setup
tabDutToRefRegulation.Header = Properties.Resources.StrGbxDutToRefRegulation;
tabDutToRefCalibration.Header = Properties.Resources.StrGbxDutToRefCalibration;
tabRefToScaleCalibration.Header = Properties.Resources.StrGbxManualRefCalibration;
tabDutToRefRegulation.Header = StrGbxDutToRefRegulation;
tabDutToRefCalibration.Header = StrGbxDutToRefCalibration;
tabRefToScaleCalibration.Header = StrGbxManualRefCalibration;
// Menu setup
//hlpMenu.Header = Properties.Resources.StrLblHelp;
@ -590,57 +593,57 @@ namespace Sensus.Ui.FM2014TestBench
//optMenuLogin.Header = Properties.Resources.StrLblOptionsLogin;
//optMenuLogout.Header = Properties.Resources.StrLblOptionsLogout;
//optMenuChangePassword.Header = Properties.Resources.StrLblOptionsChangePassword;
portMenu.Content = Properties.Resources.StrLblComPort;
portMenu.Content = StrLblComPort;
// Static labels for all devices
lblSerialNumberText.Content = Properties.Resources.StrLblFM2014SerialNumber;
lblLifeTimeText.Content = Properties.Resources.StrLblLifetime;
lblSlotSelection.Content = Properties.Resources.StrLblSlotSelection;
lblSerialNumberText.Content = StrLblFM2014SerialNumber;
lblLifeTimeText.Content = StrLblLifetime;
lblSlotSelection.Content = StrLblSlotSelection;
// DUT to REF Regulation
lblRefPulsesPerCm.Content = Properties.Resources.StrLblRefPulsesPerCmRatio;
lblDutPulsesPerCm.Content = Properties.Resources.StrLblDutPulsesPerCmRatio;
lblScaleRefToDut.Content = Properties.Resources.StrLblRefToDutScale;
lblRefPulsesPerCm.Content = StrLblRefPulsesPerCmRatio;
lblDutPulsesPerCm.Content = StrLblDutPulsesPerCmRatio;
lblScaleRefToDut.Content = StrLblRefToDutScale;
tbxScaleRefToDut.IsReadOnly = true;
lblToleranceDisplayAttenuation.Content = Properties.Resources.StrLblDisplayAttenuation;
btnSaveSetupToFm2014.Content = Properties.Resources.StrBtnSaveRegulationSetup;
lblToleranceDisplayAttenuation.Content = StrLblDisplayAttenuation;
btnSaveSetupToFm2014.Content = StrBtnSaveRegulationSetup;
UiElmEnable(btnSaveSetupToFm2014, false, _displayBtnSaveSetupToFm2014);
lblToleranceDisplayRange.Content = Properties.Resources.StrLblFM2014Tolerance;
chkUseDampedTolerance.Content = Properties.Resources.StrChkUseDampedTolerance;
btnDutToRefRegulation.Content = Properties.Resources.StrBtnStartRegulation;
lblToleranceDisplayRange.Content = StrLblFM2014Tolerance;
chkUseDampedTolerance.Content = StrChkUseDampedTolerance;
btnDutToRefRegulation.Content = StrBtnStartRegulation;
// Time measurement / DUT to REF Calibration
rbtRefTimeMeasurement.Content = Properties.Resources.StrSelectRefTimeMeasurement;
rbtDutTimeMeasurement.Content = Properties.Resources.StrSelectDutTimeMeasurement;
rbtDutToRefCalibration.Content = Properties.Resources.StrSelectDutToRefCalibration;
rbtRefTimeMeasurement.Content = StrSelectRefTimeMeasurement;
rbtDutTimeMeasurement.Content = StrSelectDutTimeMeasurement;
rbtDutToRefCalibration.Content = StrSelectDutToRefCalibration;
rbtDutToRefCalibration.IsChecked = true;
lblRefPulsesRequired.Content = Properties.Resources.StrLblRefPulsesRequired;
lblDutPulsesRequired.Content = Properties.Resources.StrLblDutPulsesRequired;
lblDoublePulseDeadtime.Content = Properties.Resources.StrLblDoublePulseDeadTime;
lblDutToRefTolMax.Content = Properties.Resources.StrLblDutToRefToleranceMax;
lblDutToRefTolMin.Content = Properties.Resources.StrLblDutToRefToleranceMin;
lblRefPulsesRequired.Content = StrLblRefPulsesRequired;
lblDutPulsesRequired.Content = StrLblDutPulsesRequired;
lblDoublePulseDeadtime.Content = StrLblDoublePulseDeadTime;
lblDutToRefTolMax.Content = StrLblDutToRefToleranceMax;
lblDutToRefTolMin.Content = StrLblDutToRefToleranceMin;
// Pulse counter measurement / Manual REF to Volume Calibration
chkRefPulsesMeasured.Content = Properties.Resources.StrLblRefPulsesMeasured;
chkRefPulsesMeasured.Content = StrLblRefPulsesMeasured;
chkRefPulsesMeasured.IsChecked = true;
tbxRefPulsesMeasured.Text = "";
tbxRefPulsesMeasured.IsReadOnly = true;
chkDutPulsesMeasured.Content = Properties.Resources.StrLblDutPulsesMeasured;
chkDutPulsesMeasured.Content = StrLblDutPulsesMeasured;
chkDutPulsesMeasured.IsChecked = false;
tbxDutPulsesMeasured.Text = "";
tbxDutPulsesMeasured.IsReadOnly = true;
lblVolumeMeasuredLiters.Content = Properties.Resources.StrLblVolumeMeasured;
lblVolumeMeasuredLiters.Content = StrLblVolumeMeasured;
tbxVolumeMeasuredLiters.Text = "";
lblRefPulsesPerCmScale.Content = Properties.Resources.StrLblRefPulsesPerCmRatio;
lblRefPulsesPerCmScale.Content = StrLblRefPulsesPerCmRatio;
tbxRefPulsesPerCmCalib.Text = "";
tbxRefPulsesPerCmCalib.IsReadOnly = true;
btnRefToVolumeCalibration.Content = Properties.Resources.StrBtnStartCalibration;
btnRefToVolumeCalibration.Content = StrBtnStartCalibration;
//// Process status
//lblActualProcessLabel.Content = Properties.Resources.StrLblActualProcessStatus;
//lblTotalProcessLabel.Content = Properties.Resources.StrLblOverallProcessStatus;
lblTimeText.Text = Properties.Resources.StrLblTime;
lblTimeText.Text = StrLblTime;
});
}
@ -709,7 +712,7 @@ namespace Sensus.Ui.FM2014TestBench
if (string.IsNullOrEmpty(cbxProgramComPort?.SelectedItem?.ToString()) ||
cbxProgramComPort.SelectedItem.ToString().Equals("?"))
{
var text = Properties.Resources.StrErrorMsgComPortNotAssigned;
var text = StrErrorMsgComPortNotAssigned;
//MessageBox.Show(text, Properties.Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
LogText(text);
return;
@ -721,7 +724,7 @@ namespace Sensus.Ui.FM2014TestBench
ResetCancellationToken();
FM2014.SharedCancellationToken = _cancellationToken;
UpdateContentControl(lblActualProcessText, Properties.Resources.StrMsgConnecting);
UpdateContentControl(lblActualProcessText, StrMsgConnecting);
var comPort = cbxProgramComPort.SelectedItem.ToString();
@ -752,7 +755,7 @@ namespace Sensus.Ui.FM2014TestBench
if (!fm2014.IsLoggedOn)
{
LogErrorText(Properties.Resources.StrErrorMsgFM2014AccessDenied);
LogErrorText(StrErrorMsgFM2014AccessDenied);
continue;
}
@ -760,13 +763,14 @@ namespace Sensus.Ui.FM2014TestBench
{
// Logging to history window
LogText(StrSeparator);
LogText("FM2014 ID: " + fm2014.ConnectResponse);
LogText("FM2014 Firmware Version: " + fm2014.FwVersion);
LogText($"FM2014 {Properties.Resources.StrLblFM2014SerialNumber} {fm2014.SerialNumber}");
LogText($"FW2014 {Properties.Resources.StrLblFM2014Address} {fm2014.Address}");
LogText($"{StrLblFM2014Address} {fm2014.Address} - FM2014 ID: {fm2014.ConnectResponse}");
LogText($"{StrLblFM2014Address} {fm2014.Address} - FM2014 Firmware Version: {fm2014.FwVersion}");
LogText($"{StrLblFM2014Address} {fm2014.Address} - FM2014 {StrLblFM2014SerialNumber} " +
$"{fm2014.SerialNumber}");
LogText($"{StrLblFM2014Address} {fm2014.Address} - FW2014 {StrLblFM2014Address} {fm2014.Address}");
var dt = DateTime.UtcNow;
var msg = $"{dt:yyyy-MM-dd HH:mm:ss} UTC";
LogText($"{Properties.Resources.StrMsgPcDateTime} {msg}");
LogText($"{StrMsgPcDateTime} {msg}");
LogText(StrSeparator);
}
}
@ -911,7 +915,7 @@ namespace Sensus.Ui.FM2014TestBench
Dispatcher.Invoke(() =>
{
tbxScaleRefToDut.Background = ColorProcessFailed;
tbxScaleRefToDut.Text = Properties.Resources.StrError;
tbxScaleRefToDut.Text = StrError;
btnSaveSetupToFm2014.IsEnabled = false;
btnDutToRefRegulation.IsEnabled = false;
});
@ -1092,9 +1096,9 @@ namespace Sensus.Ui.FM2014TestBench
UiElmEnable(btnRefToVolumeCalibration, true);
// Prepare test output to start as it is used for strat and stop
UpdateContentControl(btnRefToVolumeCalibration, Properties.Resources.StrBtnStartCalibration);
UpdateContentControl(btnDutToRefCalibration, Properties.Resources.StrBtnStartCalibration);
UpdateContentControl(btnDutToRefRegulation, Properties.Resources.StrBtnStartRegulation);
UpdateContentControl(btnRefToVolumeCalibration, StrBtnStartCalibration);
UpdateContentControl(btnDutToRefCalibration, StrBtnStartCalibration);
UpdateContentControl(btnDutToRefRegulation, StrBtnStartRegulation);
var dutPulseMeasurementIsActive = false;
var refPulseMeasurementIsActive = true;
@ -1148,7 +1152,7 @@ namespace Sensus.Ui.FM2014TestBench
/// <summary>
/// Feedback from FM2014being parsed to GUI
/// </summary>
/// <remarks date="2026-Feb-02..18" author="Thomas Wiedebusch">
/// <remarks date="2026-Feb-02..20" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private void DataReceived_Handler(Object sender, ProcessExecEventArgs e)
@ -1161,7 +1165,15 @@ namespace Sensus.Ui.FM2014TestBench
if (sender is FM2014 fm2014)
{
var idx = fm2014.Address - 1;
ucFm2014 = (UcFM2014Device)UcFM2014s[idx];
// Broadcast address is 0 !!!!
if (idx < 0)
{
ucFm2014 = null;
}
else
{
ucFm2014 = (UcFM2014Device)UcFM2014s[idx];
}
}
else return;
@ -1191,6 +1203,11 @@ namespace Sensus.Ui.FM2014TestBench
// Used as marker for error, null means measurement is in range or status or health is good
Brush statusColor = null;
// Put a separator line to the output for better visibility
if (_lastAddressReceived != fm2014.Address)
LogText(StrSeparator);
_lastAddressReceived = fm2014.Address;
// Color the output for the user display for quick check capability
if (e.StatusReturn == StatusReturn.MeasurementOutOfRange)
statusColor = ColorProcessFailed;
@ -1199,35 +1216,35 @@ namespace Sensus.Ui.FM2014TestBench
if (e.StatusReturn == StatusReturn.Failed)
{
LogErrorText(resp.AnswerStr);
LogErrorText($"{StrLblFM2014Address} {fm2014.Address} - {resp.AnswerStr}");
//ErrorHandler(resp.CmdName);
}
else if (resp.IntValue == null && resp.DoubleValue == null)
{
LogText(resp.AnswerStr);
LogText($"{StrLblFM2014Address} {fm2014.Address} - {resp.AnswerStr}");
}
else if (resp.IntValue != null)
{
LogText($"{resp.AnswerStr}: {resp.IntValue:D} {resp.Unit}");
LogText($"{StrLblFM2014Address} {fm2014.Address} - {resp.AnswerStr}: {resp.IntValue:D} {resp.Unit}");
switch (resp.CmdName)
{
case CmdName.CmdGetRefPulsesRemaining:
ucFm2014.SetValue(CAL_LBL_IDX_REF_RMN_PLS, $"{resp.IntValue:D}", statusColor);
ucFm2014?.SetValue(CAL_LBL_IDX_REF_RMN_PLS, $"{resp.IntValue:D}", statusColor);
break;
case CmdName.CmdGetDutPulsesRemaining:
ucFm2014.SetValue(CAL_LBL_IDX_DUT_RMN_PLS, $"{resp.IntValue:D}", statusColor);
ucFm2014?.SetValue(CAL_LBL_IDX_DUT_RMN_PLS, $"{resp.IntValue:D}", statusColor);
break;
case CmdName.CmdGetRefPulsesCounted:
case CmdName.CmdGetRefPulsesCountedBackup:
if (firstFm2014 != null && firstFm2014.Address == fm2014.Address)
UpdateTextBox(tbxRefPulsesMeasured, $"{resp.IntValue:D}", statusColor);
ucFm2014.SetValue(CTR_LBL_IDX_REF_PLS, $"{resp.IntValue:D}", statusColor);
ucFm2014?.SetValue(CTR_LBL_IDX_REF_PLS, $"{resp.IntValue:D}", statusColor);
break;
case CmdName.CmdGetDutPulsesCounted:
case CmdName.CmdGetDutPulsesCountedBackup:
if (firstFm2014 != null && firstFm2014.Address == fm2014.Address)
UpdateTextBox(tbxDutPulsesMeasured, $"{resp.IntValue:D}", statusColor);
ucFm2014.SetValue(CTR_LBL_IDX_DUT_PLS, $"{resp.IntValue:D}", statusColor);
ucFm2014?.SetValue(CTR_LBL_IDX_DUT_PLS, $"{resp.IntValue:D}", statusColor);
break;
case CmdName.CmdSetRefPulsesPerCm:
if (firstFm2014 != null && firstFm2014.Address == fm2014.Address)
@ -1252,7 +1269,7 @@ namespace Sensus.Ui.FM2014TestBench
break;
case CmdName.CmdGetRefFrequency:
valueStr = $"{resp.IntValue:D}";
ucFm2014.SetValue(REG_LBL_IDX_REF_FREQU, valueStr, statusColor);
ucFm2014?.SetValue(REG_LBL_IDX_REF_FREQU, valueStr, statusColor);
break;
case CmdName.CmdResetMeasurement:
// Immediately lock all buttons and input fields until reset is finished
@ -1260,31 +1277,35 @@ namespace Sensus.Ui.FM2014TestBench
UiElmEnable(lblActualProgressPercent, true);
// Check countdown of reset method
if (resp.IntValue == 0)
{
ActionControl(false);
LogText(StrSeparator);
}
break;
}
}
else if (resp.DoubleValue != null)
{
LogText($"{resp.AnswerStr}: {resp.DoubleValue:F4} {resp.Unit}");
LogText($"{StrLblFM2014Address} {fm2014.Address} - {resp.AnswerStr}: {resp.DoubleValue:F4} {resp.Unit}");
switch (resp.CmdName)
{
case CmdName.CmdGetRefTimerTicks:
valueStr = $"{resp.DoubleValue:F4}";
ucFm2014.SetValue(CAL_LBL_IDX_REF_MEAS_TMR, valueStr, statusColor);
ucFm2014?.SetValue(CAL_LBL_IDX_REF_MEAS_TMR, valueStr, statusColor);
break;
case CmdName.CmdGetDutTimerTicks:
valueStr = $"{resp.DoubleValue:F4}";
ucFm2014.SetValue(CAL_LBL_IDX_DUT_MEAS_TMR, valueStr, statusColor);
ucFm2014?.SetValue(CAL_LBL_IDX_DUT_MEAS_TMR, valueStr, statusColor);
break;
case CmdName.CmdCalculatedDutToRefTolerance:
valueStr = $"{resp.DoubleValue:F4}";
ucFm2014.SetValue(CAL_LBL_IDX_DUT_TO_REF_TOL, valueStr, statusColor);
ucFm2014?.SetValue(CAL_LBL_IDX_DUT_TO_REF_TOL, valueStr, statusColor);
break;
case CmdName.CmdGetDutToRefToleranceUndamped:
case CmdName.CmdGetDutToRefToleranceDamped:
valueStr = $"{resp.DoubleValue:F3}";
ucFm2014.SetValue(REG_LBL_IDX_DUT_TO_REF_TOL, valueStr, statusColor);
ucFm2014?.SetValue(REG_LBL_IDX_DUT_TO_REF_TOL, valueStr, statusColor);
break;
case CmdName.CmdRefToDutScale:
if (firstFm2014 != null && firstFm2014.Address == fm2014.Address)
@ -1305,7 +1326,7 @@ namespace Sensus.Ui.FM2014TestBench
// break;
case CmdName.CmdCalculatedFlowRefFrequ:
valueStr = $"{resp.DoubleValue:F3}";
ucFm2014.SetValue(REG_LBL_IDX_FLOW_RATE, valueStr, statusColor);
ucFm2014?.SetValue(REG_LBL_IDX_FLOW_RATE, valueStr, statusColor);
//UpdateTextBox(tbxRefFlowRateFromRefFrequencyCmPerH, valueStr);
// TODO THW Check if the actual flow shall be taken based on 'REF Frequency'
//UpdateTextBox(tbxActualFlowRateCmPerHour, valueStr);
@ -1377,26 +1398,26 @@ namespace Sensus.Ui.FM2014TestBench
if (refPulsesRequired != null)
{
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_REF_REQ_PLS],
Properties.Resources.StrLblRefPulsesRequired);
StrLblRefPulsesRequired);
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_REF_RMN_PLS],
Properties.Resources.StrLblRefPulsesRemaining);
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_REF_MEAS_TMR], Properties.Resources.StrLblRefTimeMeasured);
StrLblRefPulsesRemaining);
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_REF_MEAS_TMR], StrLblRefTimeMeasured);
}
if (dutPulsesRequired != null)
{
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_DUT_REQ_PLS],
Properties.Resources.StrLblDutPulsesRequired);
StrLblDutPulsesRequired);
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_DUT_RMN_PLS],
Properties.Resources.StrLblDutPulsesRemaining);
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_DUT_MEAS_TMR], Properties.Resources.StrLblDutTimeMeasured);
StrLblDutPulsesRemaining);
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_DUT_MEAS_TMR], StrLblDutTimeMeasured);
}
if (refPulsesRequired != null && dutPulsesRequired != null)
{
UpdateContentControl(MeasurementLabels[CAL_LBL_IDX_DUT_TO_REF_TOL],
Properties.Resources.StrLblDutToRefToleranceMeasured);
StrLblDutToRefToleranceMeasured);
}
UiElmEnable(MeasurementLabels[CAL_LBL_IDX_REF_REQ_PLS], true);
@ -1436,7 +1457,7 @@ namespace Sensus.Ui.FM2014TestBench
{
_autoProgressBar = false;
ActionControl(true);
UpdateContentControl(btnDutToRefCalibration, Properties.Resources.StrBtnStopCalibration);
UpdateContentControl(btnDutToRefCalibration, StrBtnStopCalibration);
UiElmEnable(btnDutToRefCalibration, true);
}
}
@ -1464,9 +1485,9 @@ namespace Sensus.Ui.FM2014TestBench
UiElmEnable(measLbl, false, false);
// Set the measurement labels
UpdateContentControl(MeasurementLabels[REG_LBL_IDX_REF_FREQU], Properties.Resources.StrLblRefFrequencyHz);
UpdateContentControl(MeasurementLabels[REG_LBL_IDX_FLOW_RATE], Properties.Resources.StrLblFlowRateMeasured);
UpdateContentControl(MeasurementLabels[REG_LBL_IDX_DUT_TO_REF_TOL], Properties.Resources.StrLblDutToRefToleranceMeasured);
UpdateContentControl(MeasurementLabels[REG_LBL_IDX_REF_FREQU], StrLblRefFrequencyHz);
UpdateContentControl(MeasurementLabels[REG_LBL_IDX_FLOW_RATE], StrLblFlowRateMeasured);
UpdateContentControl(MeasurementLabels[REG_LBL_IDX_DUT_TO_REF_TOL], StrLblDutToRefToleranceMeasured);
UiElmEnable(MeasurementLabels[REG_LBL_IDX_REF_FREQU], true);
UiElmEnable(MeasurementLabels[REG_LBL_IDX_FLOW_RATE], true);
UiElmEnable(MeasurementLabels[REG_LBL_IDX_DUT_TO_REF_TOL], true);
@ -1492,7 +1513,7 @@ namespace Sensus.Ui.FM2014TestBench
{
_autoProgressBar = true;
ActionControl(true);
UpdateContentControl(btnDutToRefRegulation, Properties.Resources.StrBtnStopRegulation);
UpdateContentControl(btnDutToRefRegulation, StrBtnStopRegulation);
UiElmEnable(btnDutToRefRegulation, true);
}
}
@ -1521,8 +1542,8 @@ namespace Sensus.Ui.FM2014TestBench
UiElmEnable(measLbl, false, false);
// Set the measurement labels
UpdateContentControl(MeasurementLabels[CTR_LBL_IDX_REF_PLS], Properties.Resources.StrLblRefPulsesMeasured);
UpdateContentControl(MeasurementLabels[CTR_LBL_IDX_DUT_PLS], Properties.Resources.StrLblDutPulsesMeasured);
UpdateContentControl(MeasurementLabels[CTR_LBL_IDX_REF_PLS], StrLblRefPulsesMeasured);
UpdateContentControl(MeasurementLabels[CTR_LBL_IDX_DUT_PLS], StrLblDutPulsesMeasured);
UiElmEnable(MeasurementLabels[CTR_LBL_IDX_REF_PLS], true);
UiElmEnable(MeasurementLabels[CTR_LBL_IDX_DUT_PLS], true);
@ -1558,7 +1579,7 @@ namespace Sensus.Ui.FM2014TestBench
{
_autoProgressBar = true;
ActionControl(true);
UpdateContentControl(btnRefToVolumeCalibration, Properties.Resources.StrBtnStopCalibration);
UpdateContentControl(btnRefToVolumeCalibration, StrBtnStopCalibration);
UiElmEnable(btnRefToVolumeCalibration, true);
}
}
@ -2501,7 +2522,7 @@ namespace Sensus.Ui.FM2014TestBench
{
tbxVolumeMeasuredLiters.Background = ColorProcessFailed;
tbxRefPulsesPerCmCalib.Background = ColorProcessFailed;
tbxRefPulsesPerCm.Text = Properties.Resources.StrError;
tbxRefPulsesPerCm.Text = StrError;
}
}
});