FM2014: - optimization
This commit is contained in:
parent
49c7cc5cc6
commit
20ab81eba7
@ -415,6 +415,42 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parameter format to convert the response or the request
|
||||
/// </summary>
|
||||
public enum ParaFormat
|
||||
{
|
||||
/// <summary>
|
||||
/// String taken directly to send or as received
|
||||
/// </summary>
|
||||
STRING,
|
||||
|
||||
/// <summary>
|
||||
/// Double format
|
||||
/// </summary>
|
||||
DOUBLE,
|
||||
|
||||
/// <summary>
|
||||
/// Hexadecimal integer
|
||||
/// </summary>
|
||||
INT_HEX,
|
||||
|
||||
/// <summary>
|
||||
/// Decimal integer
|
||||
/// </summary>
|
||||
INT_DEZ,
|
||||
|
||||
/// <summary>
|
||||
/// Individual formatting required
|
||||
/// </summary>
|
||||
INDIVIDUAL,
|
||||
|
||||
/// <summary>
|
||||
/// Parameterless means the command will be sent without any parameter
|
||||
/// </summary>
|
||||
PARAMETERLESS
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Assembly of command information and functional code
|
||||
/// </summary>
|
||||
@ -435,6 +471,11 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
|
||||
/// </summary>
|
||||
public readonly CmdType CmdType;
|
||||
|
||||
/// <summary>
|
||||
/// Command parameter style for raw data conversion from response string or for transmission
|
||||
/// </summary>
|
||||
public readonly ParaFormat ParamFormat;
|
||||
|
||||
/// <summary>
|
||||
/// Multilingual command information string
|
||||
/// </summary>
|
||||
@ -446,12 +487,15 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
|
||||
/// <param name="cmdName">Enumerator of command name acronym</param>
|
||||
/// <param name="cmdCodeStr">Code being sent to FM2014 as string</param>
|
||||
/// <param name="cmdType">Command type regarding the address (broadcast or individual) and answer</param>
|
||||
/// <param name="paraFormat">parameter format for conversion</param>
|
||||
/// <param name="cmdInfoStr">Multilingual command information string</param>
|
||||
public Cmd(CmdName cmdName, String cmdCodeStr, CmdType cmdType, String cmdInfoStr)
|
||||
public Cmd(CmdName cmdName, String cmdCodeStr, CmdType cmdType, ParaFormat paraFormat,
|
||||
String cmdInfoStr)
|
||||
{
|
||||
CmdName = cmdName;
|
||||
CmdCodeStr = cmdCodeStr;
|
||||
CmdType = cmdType;
|
||||
ParamFormat = paraFormat;
|
||||
CmdInfoStr = cmdInfoStr;
|
||||
}
|
||||
}
|
||||
@ -512,65 +556,65 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
|
||||
public static readonly List<Cmd> CmdTbl = new List<Cmd>
|
||||
{
|
||||
// FM2014 control and information
|
||||
new Cmd(CmdName.CMD_CONNECT, "", CmdType.INDIVIDUAL, Resources.StrCmdMsgConnect),
|
||||
new Cmd(CmdName.CMD_UNLOCK_SETUP, "&U@", CmdType.INDIVIDUAL, Resources.StrCmdMsgUnlock),
|
||||
new Cmd(CmdName.CMD_ERASE_SETUP, "&E@", CmdType.INDIVIDUAL, Resources.StrCmdMsgErase),
|
||||
new Cmd(CmdName.CMD_READ_EEP_MEAS_SETUP, "%D@", CmdType.INDIVIDUAL, Resources.StrCmdMsgReadDefMeasSetup),
|
||||
new Cmd(CmdName.CMD_READ_RAM_MEAS_SETUP, "%A@", CmdType.INDIVIDUAL, Resources.StrCmdMsgActualDefMeasSetup),
|
||||
new Cmd(CmdName.CMD_SAVE_RAM_TO_EEP_MEAS_SETUP, "%S@", CmdType.INDIVIDUAL, Resources.StrCmdMsgStoreDefMeasSetup),
|
||||
new Cmd(CmdName.CMD_BOOT_MODE, "$B@", CmdType.INDIVIDUAL, Resources.StrCmdMsgBootMode),
|
||||
new Cmd(CmdName.CMD_PRINT_APP_INFO, "?A", CmdType.INDIVIDUAL, Resources.StrCmdMsgPrintAppInfo),
|
||||
new Cmd(CmdName.CMD_PRINT_BOOT_INFO, "?B", CmdType.INDIVIDUAL, Resources.StrCmdMsgPrintBootInfo),
|
||||
new Cmd(CmdName.CMD_BAUDRATE_PC, "=BP", CmdType.INDIVIDUAL, Resources.StrCmdMsgBaudrateAll),
|
||||
new Cmd(CmdName.CMD_GET_VIRTUAL_ADDRESS, " ", CmdType.INDIVIDUAL, Resources.StrCmdMsgGetVirtualAddress),
|
||||
new Cmd(CmdName.CMD_SERIAL, "#", CmdType.INDIVIDUAL, Resources.StrCmdMsgSerial),
|
||||
new Cmd(CmdName.CMD_GET_STATUS, UNICODE_ACK, CmdType.INDIVIDUAL, Resources.StrCmdMsgGetStatus),
|
||||
new Cmd(CmdName.CMD_SET_VIRTUAL_ADDRESS, "N", CmdType.INDIVIDUAL, Resources.StrCmdMsgSetVirtualAddress),
|
||||
new Cmd(CmdName.CMD_PRINT_STATISTICS, "!", CmdType.INDIVIDUAL, Resources.StrCmdMsgPrintStatistics),
|
||||
new Cmd(CmdName.CMD_CONNECT, "", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgConnect),
|
||||
new Cmd(CmdName.CMD_UNLOCK_SETUP, "&U@", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgUnlock),
|
||||
new Cmd(CmdName.CMD_ERASE_SETUP, "&E@", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgErase),
|
||||
new Cmd(CmdName.CMD_READ_EEP_MEAS_SETUP, "%D@", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgReadDefMeasSetup),
|
||||
new Cmd(CmdName.CMD_READ_RAM_MEAS_SETUP, "%A@", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgActualDefMeasSetup),
|
||||
new Cmd(CmdName.CMD_SAVE_RAM_TO_EEP_MEAS_SETUP, "%S@", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgStoreDefMeasSetup),
|
||||
new Cmd(CmdName.CMD_BOOT_MODE, "$B@", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgBootMode),
|
||||
new Cmd(CmdName.CMD_PRINT_APP_INFO, "?A", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgPrintAppInfo),
|
||||
new Cmd(CmdName.CMD_PRINT_BOOT_INFO, "?B", CmdType.INDIVIDUAL, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgPrintBootInfo),
|
||||
new Cmd(CmdName.CMD_BAUDRATE_PC, "=BP", CmdType.INDIVIDUAL, ParaFormat.INT_DEZ, Resources.StrCmdMsgBaudrateAll),
|
||||
new Cmd(CmdName.CMD_GET_VIRTUAL_ADDRESS, " ", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgGetVirtualAddress),
|
||||
new Cmd(CmdName.CMD_SERIAL, "#", CmdType.INDIVIDUAL, ParaFormat.INT_DEZ, Resources.StrCmdMsgSerial),
|
||||
new Cmd(CmdName.CMD_GET_STATUS, UNICODE_ACK, CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgGetStatus),
|
||||
new Cmd(CmdName.CMD_SET_VIRTUAL_ADDRESS, "N", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgSetVirtualAddress),
|
||||
new Cmd(CmdName.CMD_PRINT_STATISTICS, "!", CmdType.INDIVIDUAL, ParaFormat.STRING, Resources.StrCmdMsgPrintStatistics),
|
||||
//measurement reset
|
||||
new Cmd(CmdName.CMD_RST_MEAS, "R", CmdType.BROADCAST, Resources.StrCmdMsgRstMeas),
|
||||
new Cmd(CmdName.CMD_RST_MEAS, "R", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgRstMeas),
|
||||
// Double impulse detection settings
|
||||
new Cmd(CmdName.CMD_SET_DPLS_LOCK_TMR, "S", CmdType.BROADCAST, Resources.StrCmdMsgDplsLockTmr),
|
||||
new Cmd(CmdName.CMD_SET_DPLS_LOCK_MULT, "s", CmdType.BROADCAST, Resources.StrCmdMsgDplsLockMult),
|
||||
new Cmd(CmdName.CMD_SET_DBPL_UNLOCK, "G", CmdType.BROADCAST, Resources.StrCmdMsgSetDbplUnlock),
|
||||
new Cmd(CmdName.CMD_SET_DPLS_LOCK_TMR, "S", CmdType.BROADCAST, ParaFormat.INT_DEZ, Resources.StrCmdMsgDplsLockTmr),
|
||||
new Cmd(CmdName.CMD_SET_DPLS_LOCK_MULT, "s", CmdType.BROADCAST, ParaFormat.INT_DEZ, Resources.StrCmdMsgDplsLockMult),
|
||||
new Cmd(CmdName.CMD_SET_DBPL_UNLOCK, "G", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgSetDbplUnlock),
|
||||
// Main measurement pulse settings and readout
|
||||
new Cmd(CmdName.CMD_DUT_SET_PLS, "H", CmdType.BROADCAST, Resources.StrCmdMsgDutSetPls),
|
||||
new Cmd(CmdName.CMD_REF_SET_PLS, "M", CmdType.BROADCAST, Resources.StrCmdMsgRefSetPls),
|
||||
new Cmd(CmdName.CMD_DUT_GET_PLS_RMN, "I", CmdType.INDIVIDUAL, Resources.StrCmdMsgDutGetPlsRmn),
|
||||
new Cmd(CmdName.CMD_REF_GET_PLS_RMN, "J", CmdType.INDIVIDUAL, Resources.StrCmdMsgRefGetPlsRmn),
|
||||
new Cmd(CmdName.CMD_DUT_SET_PLS, "H", CmdType.BROADCAST, ParaFormat.INT_HEX, Resources.StrCmdMsgDutSetPls),
|
||||
new Cmd(CmdName.CMD_REF_SET_PLS, "M", CmdType.BROADCAST, ParaFormat.INT_HEX, Resources.StrCmdMsgRefSetPls),
|
||||
new Cmd(CmdName.CMD_DUT_GET_PLS_RMN, "I", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgDutGetPlsRmn),
|
||||
new Cmd(CmdName.CMD_REF_GET_PLS_RMN, "J", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgRefGetPlsRmn),
|
||||
// Pulse counters start, readout and backup
|
||||
new Cmd(CmdName.CMD_REF_STR_PLS_CTR, "O", CmdType.BROADCAST, Resources.StrCmdMsgRefStrPlsCtr),
|
||||
new Cmd(CmdName.CMD_DUT_STR_PLS_CTR, "Q", CmdType.BROADCAST, Resources.StrCmdMsgDutStrPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_GET_PLS_CTR, "L", CmdType.INDIVIDUAL, Resources.StrCmdMsgRefGetPlsCtr),
|
||||
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR, "U", CmdType.INDIVIDUAL, Resources.StrCmdMsgDutGetPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_GET_PLS_CTR_BU, "l", CmdType.INDIVIDUAL, Resources.StrCmdMsgRefGetPlsCtrBu),
|
||||
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR_BU, "u", CmdType.INDIVIDUAL, Resources.StrCmdMsgDutGetPlsCtrBu),
|
||||
new Cmd(CmdName.CMD_REF_DUT_STR_PLS_CTR, "o", CmdType.BROADCAST, Resources.StrCmdMsgRefDutStrPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_DUT_BU_PLS_CTR, "q", CmdType.BROADCAST, Resources.StrCmdMsgRefDutBuPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_STR_PLS_CTR, "O", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgRefStrPlsCtr),
|
||||
new Cmd(CmdName.CMD_DUT_STR_PLS_CTR, "Q", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgDutStrPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_GET_PLS_CTR, "L", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgRefGetPlsCtr),
|
||||
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR, "U", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgDutGetPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_GET_PLS_CTR_BU, "l", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgRefGetPlsCtrBu),
|
||||
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR_BU, "u", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgDutGetPlsCtrBu),
|
||||
new Cmd(CmdName.CMD_REF_DUT_STR_PLS_CTR, "o", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgRefDutStrPlsCtr),
|
||||
new Cmd(CmdName.CMD_REF_DUT_BU_PLS_CTR, "q", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgRefDutBuPlsCtr),
|
||||
// General measurement setup
|
||||
new Cmd(CmdName.CMD_REF_SET_SCALE, "K", CmdType.BROADCAST, Resources.StrCmdMsgRefSetScale),
|
||||
new Cmd(CmdName.CMD_DUT_LPP_SCALE, "V", CmdType.INDIVIDUAL_UNRESPONSIVE, Resources.StrCmdMsgDutLppScale),
|
||||
new Cmd(CmdName.CMD_REF_LPP_SCALE, "W", CmdType.INDIVIDUAL_UNRESPONSIVE, Resources.StrCmdMsgRefLppScale),
|
||||
new Cmd(CmdName.CMD_MEAS_SET_ATTN, "T", CmdType.BROADCAST, Resources.StrCmdMsgMeasSetAttn),
|
||||
new Cmd(CmdName.CMD_REF_SET_SCALE, "K", CmdType.BROADCAST, ParaFormat.INDIVIDUAL, Resources.StrCmdMsgRefSetScale),
|
||||
new Cmd(CmdName.CMD_DUT_LPP_SCALE, "V", CmdType.INDIVIDUAL_UNRESPONSIVE, ParaFormat.INT_DEZ, Resources.StrCmdMsgDutLppScale),
|
||||
new Cmd(CmdName.CMD_REF_LPP_SCALE, "W", CmdType.INDIVIDUAL_UNRESPONSIVE, ParaFormat.INT_DEZ, Resources.StrCmdMsgRefLppScale),
|
||||
new Cmd(CmdName.CMD_MEAS_SET_ATTN, "T", CmdType.BROADCAST, ParaFormat.INT_DEZ, Resources.StrCmdMsgMeasSetAttn),
|
||||
// Measurement result request
|
||||
new Cmd(CmdName.CMD_DUT_GET_TMR, "X", CmdType.INDIVIDUAL, Resources.StrCmdMsgDutGetTmr),
|
||||
new Cmd(CmdName.CMD_REF_GET_TMR, "Y", CmdType.INDIVIDUAL, Resources.StrCmdMsgRefGetTmr),
|
||||
new Cmd(CmdName.CMD_CAL_DUT_TO_REF_TOL, "", CmdType.INDIVIDUAL, Resources.StrCalDutToRefTol),
|
||||
new Cmd(CmdName.CMD_GET_UDTLC, "Z", CmdType.INDIVIDUAL, Resources.StrCmdMsgGetUdtlc),
|
||||
new Cmd(CmdName.CMD_GET_DTLC, "z", CmdType.INDIVIDUAL, Resources.StrCmdMsgGetDtlc),
|
||||
new Cmd(CmdName.CMD_GET_REF_PERIOD, UNICODE_DLE, CmdType.INDIVIDUAL, Resources.StrCmdMsgGetRefPeriod),
|
||||
new Cmd(CmdName.CMD_GET_DUT_PERIOD, UNICODE_DC1, CmdType.INDIVIDUAL, Resources.StrCmdMsgGetDutPeriod),
|
||||
new Cmd(CmdName.CMD_GET_REF_FREQU, UNICODE_DC2, CmdType.INDIVIDUAL, Resources.StrCmdMsgGetRefFrequ),
|
||||
new Cmd(CmdName.CMD_CAL_FREQU_REF_PERIOD, "", CmdType.INDIVIDUAL, Resources.StrCalRefFrequFromRefPeriod),
|
||||
new Cmd(CmdName.CMD_CAL_FREQU_DUT_PERIOD, "", CmdType.INDIVIDUAL, Resources.StrCalDutFrequFromDutPeriod),
|
||||
new Cmd(CmdName.CMD_CAL_FLOW_REF_FREQU, "", CmdType.INDIVIDUAL, Resources.StrCalRefFlowRateFromRefFrequ),
|
||||
new Cmd(CmdName.CMD_CAL_FLOW_REF_PERIOD, "", CmdType.INDIVIDUAL, Resources.StrCalRefFlowRateFromRefPeriod),
|
||||
new Cmd(CmdName.CMD_CAL_FLOW_DUT_PERIOD, "", CmdType.INDIVIDUAL, Resources.StrCalDutFlowRateFromDutPeriod),
|
||||
new Cmd(CmdName.CMD_DUT_GET_TMR, "X", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgDutGetTmr),
|
||||
new Cmd(CmdName.CMD_REF_GET_TMR, "Y", CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgRefGetTmr),
|
||||
new Cmd(CmdName.CMD_CAL_DUT_TO_REF_TOL, "", CmdType.INDIVIDUAL, ParaFormat.DOUBLE, Resources.StrCalDutToRefTol),
|
||||
new Cmd(CmdName.CMD_GET_UDTLC, "Z", CmdType.INDIVIDUAL, ParaFormat.INDIVIDUAL, Resources.StrCmdMsgGetUdtlc),
|
||||
new Cmd(CmdName.CMD_GET_DTLC, "z", CmdType.INDIVIDUAL, ParaFormat.INDIVIDUAL, Resources.StrCmdMsgGetDtlc),
|
||||
new Cmd(CmdName.CMD_GET_REF_PERIOD, UNICODE_DLE, CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgGetRefPeriod),
|
||||
new Cmd(CmdName.CMD_GET_DUT_PERIOD, UNICODE_DC1, CmdType.INDIVIDUAL,ParaFormat.INT_HEX, Resources.StrCmdMsgGetDutPeriod),
|
||||
new Cmd(CmdName.CMD_GET_REF_FREQU, UNICODE_DC2, CmdType.INDIVIDUAL, ParaFormat.INT_HEX, Resources.StrCmdMsgGetRefFrequ),
|
||||
new Cmd(CmdName.CMD_CAL_FREQU_REF_PERIOD, "", CmdType.INDIVIDUAL, ParaFormat.DOUBLE, Resources.StrCalRefFrequFromRefPeriod),
|
||||
new Cmd(CmdName.CMD_CAL_FREQU_DUT_PERIOD, "", CmdType.INDIVIDUAL, ParaFormat.DOUBLE, Resources.StrCalDutFrequFromDutPeriod),
|
||||
new Cmd(CmdName.CMD_CAL_FLOW_REF_FREQU, "", CmdType.INDIVIDUAL, ParaFormat.DOUBLE, Resources.StrCalRefFlowRateFromRefFrequ),
|
||||
new Cmd(CmdName.CMD_CAL_FLOW_REF_PERIOD, "", CmdType.INDIVIDUAL, ParaFormat.DOUBLE, Resources.StrCalRefFlowRateFromRefPeriod),
|
||||
new Cmd(CmdName.CMD_CAL_FLOW_DUT_PERIOD, "", CmdType.INDIVIDUAL, ParaFormat.DOUBLE, Resources.StrCalDutFlowRateFromDutPeriod),
|
||||
// Adjustment, place here Ids which may represent digital numbers from A to F
|
||||
new Cmd(CmdName.CMD_COR_CURRENT, "C", CmdType.BROADCAST, Resources.StrCmdMsgCorCurrent),
|
||||
new Cmd(CmdName.CMD_SET_XTR_MAX, "+", CmdType.BROADCAST, Resources.StrCmdMsgSetXtrMax),
|
||||
new Cmd(CmdName.CMD_SET_XTR_MIN, "-", CmdType.BROADCAST, Resources.StrCmdMsgSetXtrMin),
|
||||
new Cmd(CmdName.CMD_ADDR_PC, "A", CmdType.INDIVIDUAL, Resources.StrCmdMsgAddrPc)
|
||||
new Cmd(CmdName.CMD_COR_CURRENT, "C", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgCorCurrent),
|
||||
new Cmd(CmdName.CMD_SET_XTR_MAX, "+", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgSetXtrMax),
|
||||
new Cmd(CmdName.CMD_SET_XTR_MIN, "-", CmdType.BROADCAST, ParaFormat.PARAMETERLESS, Resources.StrCmdMsgSetXtrMin),
|
||||
new Cmd(CmdName.CMD_ADDR_PC, "A", CmdType.INDIVIDUAL, ParaFormat.INT_DEZ, Resources.StrCmdMsgAddrPc)
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
@ -721,5 +765,20 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
|
||||
where ct.CmdName == cmdName
|
||||
select ct.CmdType).FirstOrDefault();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the parameter format
|
||||
/// </summary>
|
||||
/// <param name="cmdName"></param>
|
||||
/// <returns>Command type</returns>
|
||||
/// <remarks date="2026-Feb-13" author="Thomas Wiedebusch">
|
||||
/// - Initial.
|
||||
/// </remarks>
|
||||
public static ParaFormat GetParaFormat(CmdName cmdName)
|
||||
{
|
||||
return (from ct in CmdTbl
|
||||
where ct.CmdName == cmdName
|
||||
select ct.ParamFormat).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -197,17 +197,23 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
/// </summary>
|
||||
private const Int32 PROCESSES_SAVE_STAND_ALONE_MEASUREMENT = 5;
|
||||
#endregion ---------------------------------------- constants -------------------------------------------------
|
||||
|
||||
#region ------------------------------------------- events ----------------------------------------------------
|
||||
/// <summary>
|
||||
/// Received data feedback
|
||||
/// </summary>
|
||||
public event EventHandler<ProcessExecEventArgs> OnRawRecordReceived;
|
||||
#endregion ---------------------------------------- events ----------------------------------------------------
|
||||
|
||||
#region ------------------------------------------- static properties -----------------------------------------
|
||||
/// <summary>
|
||||
/// Reminder of actual ongoing measurement information
|
||||
/// </summary>
|
||||
private static String MeasurementInfo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private static Boolean DisableWriteReadActualProcessIncreasing { get; set; }
|
||||
|
||||
private static Boolean _disableWriteReadActualProcessIncreasing;
|
||||
/// <summary>
|
||||
/// Shared cancellation token
|
||||
/// </summary>
|
||||
@ -803,7 +809,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
private static void InitActualProcessProgress(Int32? maxInitProcesses = null, Boolean broadcast = false,
|
||||
Boolean disableWriteReadIncrease = false)
|
||||
{
|
||||
_disableWriteReadActualProcessIncreasing = disableWriteReadIncrease;
|
||||
DisableWriteReadActualProcessIncreasing = disableWriteReadIncrease;
|
||||
MaxActualProcessProgress = 1;
|
||||
ActualProcessProgress = 0;
|
||||
|
||||
@ -820,6 +826,27 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Common handler to publish the response.
|
||||
/// </summary>
|
||||
/// <param name="fm2014"></param>
|
||||
/// <param name="cmdResponse"></param>
|
||||
/// <param name="statusReturn"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks date="2026-Feb-13" author="Thomas Wiedebusch">
|
||||
/// - Initial.
|
||||
/// </remarks>
|
||||
private static void ResponseEvent(FM2014 fm2014, CmdResponse cmdResponse,
|
||||
StatusReturn statusReturn = StatusReturn.Unknown)
|
||||
{
|
||||
var processExecEventArgs = new ProcessExecEventArgs("",
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
actualProcessPercent: ActualProcessProgress,
|
||||
statusReturn: statusReturn,
|
||||
specificInfoObj: cmdResponse);
|
||||
fm2014?.OnRawRecordReceived?.Invoke(fm2014, processExecEventArgs);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Common handler to publish the response.
|
||||
/// </summary>
|
||||
@ -895,7 +922,6 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
}
|
||||
|
||||
var cmdName = CmdName.CMD_NA;
|
||||
String measurementInfoStr;
|
||||
|
||||
// Prepare REF and/or DUT pulse counter measurement, the first call activates if one or both are started!
|
||||
try
|
||||
@ -904,15 +930,15 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
{
|
||||
case true when firstActiveFm2014.DutPulseCtrOn:
|
||||
cmdName = CmdName.CMD_REF_DUT_STR_PLS_CTR;
|
||||
measurementInfoStr = Resources.StrMeasMsgPulseCtrRefDut;
|
||||
MeasurementInfo = Resources.StrMeasMsgPulseCtrRefDut;
|
||||
break;
|
||||
case true:
|
||||
cmdName = CmdName.CMD_REF_STR_PLS_CTR;
|
||||
measurementInfoStr = Resources.StrMeasMsgPulseCtrRef;
|
||||
MeasurementInfo = Resources.StrMeasMsgPulseCtrRef;
|
||||
break;
|
||||
default:
|
||||
cmdName = CmdName.CMD_DUT_STR_PLS_CTR;
|
||||
measurementInfoStr = Resources.StrMeasMsgPulseCtrDut;
|
||||
MeasurementInfo = Resources.StrMeasMsgPulseCtrDut;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -972,32 +998,23 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
{
|
||||
try
|
||||
{
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE)
|
||||
{
|
||||
if (fm2014.RefPulseCtrOn && Write(cmdNameRef, fm2014))
|
||||
{
|
||||
if (Read(cmdNameRef, fm2014, out var responseStr) &&
|
||||
int.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var intValue))
|
||||
{
|
||||
var response = new CmdResponse(cmdNameRef, infoRef, intValue);
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfoStr,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
}
|
||||
if (SharedCyclicMeasSequ == CyclicMeasSequ.IDLE) continue;
|
||||
|
||||
if (fm2014.DutPulseCtrOn && Write(cmdNameDut, fm2014))
|
||||
if (fm2014.RefPulseCtrOn && Write(cmdNameRef, fm2014))
|
||||
{
|
||||
if (Read(cmdNameRef, fm2014, out _, out var intValue))
|
||||
{
|
||||
if (Read(cmdNameDut, fm2014, out var responseStr) &&
|
||||
int.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var intValue))
|
||||
{
|
||||
var response = new CmdResponse(cmdNameDut, infoDut, intValue);
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfoStr,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
var response = new CmdResponse(cmdNameRef, infoRef, intValue);
|
||||
ResponseEvent(fm2014, response);
|
||||
}
|
||||
}
|
||||
|
||||
if (fm2014.DutPulseCtrOn && Write(cmdNameDut, fm2014))
|
||||
{
|
||||
if (Read(cmdNameDut, fm2014, out _, out var intValue))
|
||||
{
|
||||
var response = new CmdResponse(cmdNameDut, infoDut, intValue);
|
||||
ResponseEvent(fm2014, response);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1096,7 +1113,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
}
|
||||
|
||||
var cmdName = CmdName.CMD_NA;
|
||||
var measurementInfo = Resources.StrMeasMsgRegulation;
|
||||
MeasurementInfo = Resources.StrMeasMsgRegulation;
|
||||
// Prepare regulation measurement
|
||||
try
|
||||
{
|
||||
@ -1145,12 +1162,12 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr))
|
||||
if (Read(cmdName, fm2014, out responseStr, out _))
|
||||
{
|
||||
// The response contains a sign!
|
||||
var signMultiplier = responseStr.Contains("+") ? 1.0f : -1.0f;
|
||||
var cleanedStr = responseStr.Replace("+", "").Replace("-", "");
|
||||
if (int.TryParse(cleanedStr, NumberStyles.HexNumber,
|
||||
if (int.TryParse(cleanedStr, NumberStyles.HexNumber,
|
||||
new CultureInfo("en"), out var measTolerance))
|
||||
{
|
||||
fm2014.DutToRefToleranceMeasured_percent =
|
||||
@ -1158,16 +1175,16 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var response = new CmdResponse(cmdName, info,
|
||||
doubleValue: fm2014.DutToRefToleranceMeasured_percent,
|
||||
unit: Units.GetInfo(Units.Name.PERCENT));
|
||||
|
||||
|
||||
// Check the threshold for OOR
|
||||
if (Math.Abs((Double)fm2014.DutToRefToleranceMeasured_percent) >
|
||||
if (Math.Abs((Double)fm2014.DutToRefToleranceMeasured_percent) >
|
||||
fm2014.CurrentOutputToleranceNominalInt_percent)
|
||||
statusReturn = StatusReturn.MeasurementOutOfRange;
|
||||
else statusReturn = StatusReturn.Okay;
|
||||
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("",
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
statusReturn: statusReturn,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
@ -1180,7 +1197,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
if (fm2014.RequestDebugInformation && SharedCyclicMeasSequ != CyclicMeasSequ.IDLE &&
|
||||
Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
int.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"), out var period))
|
||||
{
|
||||
// Publish the period [ms]
|
||||
@ -1188,7 +1205,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
doubleValue: TMR_RESOLUTION_s * 1000.0 * period,
|
||||
unit: "m" + Units.GetInfo(Units.Name.TIME_s));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
|
||||
// Publish the frequency in [Hz]
|
||||
@ -1198,7 +1215,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
doubleValue: 1.0 / (TMR_RESOLUTION_s * period),
|
||||
unit: Units.GetInfo(Units.Name.FREQUENCY_Hz));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
|
||||
// Convert to m³/h (3600 s/h) based on REF pulse rate
|
||||
@ -1209,7 +1226,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
response = new CmdResponse(cmdName, info, doubleValue: fm2014.RefFlowRate_cm_per_h,
|
||||
unit: Units.GetInfo(Units.Name.FLOW_RATE_cm_per_h));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
}
|
||||
@ -1222,7 +1239,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
SharedCyclicMeasSequ != CyclicMeasSequ.IDLE &&
|
||||
Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
int.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"), out var period))
|
||||
{
|
||||
// Publish the period [ms]
|
||||
@ -1230,7 +1247,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
doubleValue: TMR_RESOLUTION_s * 1000.0 * period,
|
||||
unit: "m" + Units.GetInfo(Units.Name.TIME_s));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
|
||||
// Publish the frequency in [Hz]
|
||||
@ -1240,7 +1257,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
doubleValue: 1.0 / (TMR_RESOLUTION_s * period),
|
||||
unit: Units.GetInfo(Units.Name.FREQUENCY_Hz));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
|
||||
// Convert to m³/h (3600 s/h) based on DUT pulse rate
|
||||
@ -1251,7 +1268,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
response = new CmdResponse(cmdName, info, doubleValue: fm2014.DutFlowRate_cm_per_h,
|
||||
unit: Units.GetInfo(Units.Name.FLOW_RATE_cm_per_h));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: measurementInfo,
|
||||
new ProcessExecEventArgs("", actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
}
|
||||
@ -1262,7 +1279,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
int.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var refFrequency))
|
||||
{
|
||||
@ -1270,12 +1287,12 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
if (refFrequency < REF_FREQU_MIN || refFrequency > REF_FREQU_MAX)
|
||||
statusReturn = StatusReturn.MeasurementOutOfRange;
|
||||
else statusReturn = StatusReturn.Okay;
|
||||
|
||||
|
||||
// Publish the frequency in [Hz]
|
||||
var response = new CmdResponse(cmdName, info, refFrequency,
|
||||
unit: Units.GetInfo(Units.Name.FREQUENCY_Hz));
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
statusReturn: statusReturn,
|
||||
specificInfoObj: response));
|
||||
|
||||
@ -1288,7 +1305,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
unit: Units.GetInfo(Units.Name.FLOW_RATE_cm_per_h));
|
||||
PublishResponse(fm2014,
|
||||
new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
statusReturn: statusReturn,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
@ -1381,9 +1398,9 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
}
|
||||
|
||||
var cmdName = CmdName.CMD_NA;
|
||||
var measurementInfo = Resources.StrMeasMsgCalibration;
|
||||
MeasurementInfo = Resources.StrMeasMsgCalibration;
|
||||
|
||||
// Prepare pulse time measurement
|
||||
// Prepare pulse time measurement with all broadcast command - avoid read
|
||||
try
|
||||
{
|
||||
// Check if double pulse deadtime has been set or si switched off
|
||||
@ -1415,7 +1432,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
if (firstActiveFm2014.RefPulsesRequired != 0)
|
||||
{
|
||||
cmdName = CmdName.CMD_REF_SET_PLS;
|
||||
if (!Write(cmdName, firstActiveFm2014, firstActiveFm2014.RefPulsesRequired, true))
|
||||
if (!Write(cmdName, firstActiveFm2014, firstActiveFm2014.RefPulsesRequired))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1424,7 +1441,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
if (firstActiveFm2014.DutPulsesRequired != 0)
|
||||
{
|
||||
cmdName = CmdName.CMD_DUT_SET_PLS;
|
||||
if (!Write(cmdName, firstActiveFm2014, firstActiveFm2014.DutPulsesRequired, true))
|
||||
if (!Write(cmdName, firstActiveFm2014, firstActiveFm2014.DutPulsesRequired))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1459,21 +1476,21 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
String info;
|
||||
String responseStr;
|
||||
StatusReturn statusReturn;
|
||||
|
||||
|
||||
// Read the device status to check for timeout between pulses
|
||||
cmdName = CmdName.CMD_GET_STATUS;
|
||||
info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
int.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var status))
|
||||
{
|
||||
info += $": {responseStr}";
|
||||
var response = new CmdResponse(cmdName, info);
|
||||
var response = new CmdResponse(cmdName, info, status);
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessPercent: ActualProcessProgress_percent,
|
||||
actualProcessMessage: measurementInfo, specificInfoObj: response));
|
||||
actualProcessMessage: MeasurementInfo, specificInfoObj: response));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1487,7 +1504,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
ushort.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var pulses))
|
||||
{
|
||||
@ -1509,7 +1526,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessPercent: ActualProcessProgress_percent,
|
||||
statusReturn: statusReturn,
|
||||
actualProcessMessage: measurementInfo, specificInfoObj: response));
|
||||
actualProcessMessage: MeasurementInfo, specificInfoObj: response));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1525,7 +1542,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
ushort.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var pulses))
|
||||
{
|
||||
@ -1545,7 +1562,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
|
||||
var response = new CmdResponse(cmdName, info, pulses);
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
statusReturn: statusReturn,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
@ -1565,7 +1582,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
uint.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var timerTicks))
|
||||
{
|
||||
@ -1574,7 +1591,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var response = new CmdResponse(cmdName, info, doubleValue: fm2014.RefTimeMeasured_s,
|
||||
unit: Units.GetInfo(Units.Name.TIME_s));
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
else
|
||||
@ -1595,7 +1612,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
info = GetCmdInfo(cmdName);
|
||||
if (SharedCyclicMeasSequ != CyclicMeasSequ.IDLE && Write(cmdName, fm2014))
|
||||
{
|
||||
if (Read(cmdName, fm2014, out responseStr) &&
|
||||
if (Read(cmdName, fm2014, out responseStr, out _) &&
|
||||
uint.TryParse(responseStr, NumberStyles.HexNumber, new CultureInfo("en"),
|
||||
out var timerTicks))
|
||||
{
|
||||
@ -1604,7 +1621,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var response = new CmdResponse(cmdName, info, doubleValue: fm2014.DutTimeMeasured_s,
|
||||
unit: Units.GetInfo(Units.Name.TIME_s));
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
else
|
||||
@ -1630,18 +1647,18 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
(1.0 - fm2014.DutTimeMeasured_s / fm2014.RefTimeMeasured_s) * 100.0;
|
||||
|
||||
// Check the threshold for OOR
|
||||
if (fm2014.DutToRefToleranceMeasured_percent >
|
||||
if (fm2014.DutToRefToleranceMeasured_percent >
|
||||
fm2014.DutToRefCalibrationToleranceMax_percent ||
|
||||
fm2014.DutToRefToleranceMeasured_percent <
|
||||
fm2014.DutToRefToleranceMeasured_percent <
|
||||
fm2014.DutToRefCalibrationToleranceMin_percent)
|
||||
statusReturn = StatusReturn.MeasurementOutOfRange;
|
||||
else statusReturn = StatusReturn.Okay;
|
||||
|
||||
|
||||
var response = new CmdResponse(cmdName, info,
|
||||
doubleValue: fm2014.DutToRefToleranceMeasured_percent,
|
||||
unit: Units.GetInfo(Units.Name.PERCENT));
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("",
|
||||
actualProcessMessage: measurementInfo,
|
||||
actualProcessMessage: MeasurementInfo,
|
||||
statusReturn: statusReturn,
|
||||
specificInfoObj: response));
|
||||
}
|
||||
@ -1661,7 +1678,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
|
||||
// Check all remaining DUT and REF pulses are counted on all connected devices and finalize process by
|
||||
// reading out all results
|
||||
if (RegisteredFm2014s.All(fm2014 => fm2014.MeasurementIsReady || fm2014.ErrorIsDetected ||
|
||||
if (RegisteredFm2014s.All(fm2014 => fm2014.MeasurementIsReady || fm2014.ErrorIsDetected ||
|
||||
!fm2014.IsLoggedOn))
|
||||
{
|
||||
ResetHardwareAllDevices();
|
||||
@ -1682,20 +1699,19 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
/// </summary>
|
||||
/// <param name="cmdName"></param>
|
||||
/// <param name="fm2014"></param>
|
||||
/// <param name="responseStr"></param>
|
||||
/// <param name="responseStr">output of pure pure raw data response from FM2014</param>
|
||||
/// <param name="intValue">output of parsed response to integer value</param>
|
||||
/// <returns></returns>
|
||||
/// <remarks date="2026-Jan-23" author="Thomas Wiedebusch">
|
||||
/// <remarks date="2026-Jan-23..Feb-13" author="Thomas Wiedebusch">
|
||||
/// - Initial.
|
||||
/// </remarks>
|
||||
/// <remarks date="2026-Jan-28..Feb-10" author="Thomas Wiedebusch">
|
||||
/// - Support for multiple FM2014s.
|
||||
/// </remarks>
|
||||
private static Boolean Read(CmdName cmdName, FM2014 fm2014, out String responseStr)
|
||||
private static Boolean Read(CmdName cmdName, FM2014 fm2014, out String responseStr, out Int32? intValue)
|
||||
{
|
||||
responseStr = "";
|
||||
intValue = null;
|
||||
var info = $"{Resources.StrCommResponse}: {GetCmdInfo(cmdName)}";
|
||||
var statusReturn = StatusReturn.Failed;
|
||||
if (!_disableWriteReadActualProcessIncreasing)
|
||||
if (!DisableWriteReadActualProcessIncreasing)
|
||||
ActualProcessProgress++;
|
||||
|
||||
// Check for individual command without response
|
||||
@ -1724,6 +1740,17 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var response = new CmdResponse(cmdName, $"{isErrorStr}{info} {responseStr}");
|
||||
PublishResponse(fm2014, new ProcessExecEventArgs("", specificInfoObj: response, statusReturn: statusReturn));
|
||||
|
||||
var numberStyle = NumberStyles.None;
|
||||
if (GetParaFormat(cmdName) == ParaFormat.INT_HEX)
|
||||
{
|
||||
numberStyle = NumberStyles.HexNumber;
|
||||
}
|
||||
|
||||
if (int.TryParse(responseStr, numberStyle, new CultureInfo("en"), out var intParsedResponse))
|
||||
{
|
||||
intValue = intParsedResponse;
|
||||
}
|
||||
|
||||
return StatusReturn.Failed != statusReturn;
|
||||
}
|
||||
|
||||
@ -1740,12 +1767,11 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
/// <param name="cmdName"></param>
|
||||
/// <param name="fm2014"></param>
|
||||
/// <param name="dataObj"></param>
|
||||
/// <param name="isHexFormat"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks date="2026-Jan-12..Feb-01" author="Thomas Wiedebusch">
|
||||
/// <remarks date="2026-Jan-12..Feb-13" author="Thomas Wiedebusch">
|
||||
/// - Initial.
|
||||
/// </remarks>
|
||||
private static Boolean Write(CmdName cmdName, FM2014 fm2014, Object dataObj = null, Boolean isHexFormat = false)
|
||||
private static Boolean Write(CmdName cmdName, FM2014 fm2014, Object dataObj = null)
|
||||
{
|
||||
if (fm2014 == null)
|
||||
return false;
|
||||
@ -1757,7 +1783,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
SharedCyclicMeasSequ = CyclicMeasSequ.IDLE;
|
||||
return false;
|
||||
}
|
||||
if (!_disableWriteReadActualProcessIncreasing)
|
||||
if (!DisableWriteReadActualProcessIncreasing)
|
||||
ActualProcessProgress++;
|
||||
|
||||
// Initiate communication using the individual or broadcast address
|
||||
@ -1788,6 +1814,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
|
||||
var cmdCodeStr = GetCmdStr(cmdName);
|
||||
var info = GetCmdInfo(cmdName) + $": {cmdCodeStr}";
|
||||
var isHexFormat = GetParaFormat(cmdName) == ParaFormat.INT_HEX;
|
||||
CmdResponse response;
|
||||
// Without data the command alone needs to be sent
|
||||
if (dataObj == null)
|
||||
@ -2078,7 +2105,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var loopCtr = 4;
|
||||
do
|
||||
{
|
||||
if (Read(cmdName, this, out var responseStr))
|
||||
if (Read(cmdName, this, out var responseStr, out _))
|
||||
responseStrs.Add(responseStr);
|
||||
} while (loopCtr-- > 0);
|
||||
}
|
||||
@ -2088,7 +2115,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
var loopCtr = 5;
|
||||
do
|
||||
{
|
||||
if (Read(cmdName, this, out var responseStr))
|
||||
if (Read(cmdName, this, out var responseStr, out _))
|
||||
responseStrs.Add(responseStr);
|
||||
} while (loopCtr-- > 0);
|
||||
}
|
||||
@ -2267,7 +2294,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
|
||||
IsLoggedOn = true;
|
||||
|
||||
if (Read(cmdName, this, out var responseStr))
|
||||
if (Read(cmdName, this, out var responseStr, out _))
|
||||
SerialNumber = responseStr;
|
||||
|
||||
if (!string.IsNullOrEmpty(SerialNumber))
|
||||
@ -2282,7 +2309,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Read(cmdName, this, out responseStr))
|
||||
if (Read(cmdName, this, out responseStr, out _))
|
||||
{
|
||||
var cleanedResponse = Regex.Replace(responseStr, "[^0-9]", string.Empty);
|
||||
if (int.TryParse(cleanedResponse, out var intValue))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user