diff --git a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/FM2014.cs b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/FM2014.cs index bb0707ce..6f623471 100644 --- a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/FM2014.cs +++ b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/FM2014.cs @@ -32,15 +32,16 @@ */ //using NLog; + +using Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Properties; using System; using System.Globalization; using System.IO.Ports; using System.Threading; using System.Threading.Tasks; -using Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Consts; -using Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Properties; using Xylem.Common.CommonCore.Consts; using Xylem.Common.Utils.ProcessExec.EventArguments; +using static Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Consts.FM2014CmdDef; namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core @@ -56,7 +57,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core #region properties - private const String _eos = FM2014CmdDef.END_OF_STR; + private const String _eos = END_OF_STR; /// public Boolean CyclicReceiveTaskLoopIsActive @@ -94,8 +95,8 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core private set; } - private const String _adrPre = FM2014CmdDef.ADDR_RECORD_STR; - private const String _adrPost = FM2014CmdDef.ADDR_VALIDATION_STR; + private const String _adrPre = ADDR_RECORD_STR; + private const String _adrPost = ADDR_VALIDATION_STR; private Int32 _address; /// @@ -136,35 +137,35 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core public Boolean UseDampedTolerance { get; - private set; + set; } /// public UInt16 RefPulsePerCm { get; - private set; + set; } /// public UInt16 DutPulsePerCm { get; - private set; + set; } /// public Single RefToDutScaleNorm { get; - private set; + set; } /// public Byte Attenuation { get; - private set; + set; } /// @@ -185,8 +186,8 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core /// Number of processing steps for this actual process progress /// private Int32 MaxActualProcessProgress - { - get; + { + get; set; } @@ -207,8 +208,6 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core _actualProcessProgress = MaxActualProcessProgress; } } - - #endregion #region methods @@ -255,7 +254,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core return false; } - var cmdName = FM2014CmdDef.CmdName.CMD_NA; + var cmdName = CmdName.CMD_NA; // Prepare REF-pulse counter measurement try @@ -263,13 +262,13 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core switch (refCtrOn) { case true when dutCtrOn: - cmdName = FM2014CmdDef.CmdName.CMD_REF_DUT_STR_PLS_CTR; + cmdName = CmdName.CMD_REF_DUT_STR_PLS_CTR; break; case true: - cmdName = FM2014CmdDef.CmdName.CMD_REF_STR_PLS_CTR; + cmdName = CmdName.CMD_REF_STR_PLS_CTR; break; default: - cmdName = FM2014CmdDef.CmdName.CMD_DUT_STR_PLS_CTR; + cmdName = CmdName.CMD_DUT_STR_PLS_CTR; break; } @@ -281,7 +280,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core } catch (Exception e) { - var response = new FM2014CmdDef.CmdResponse(cmdName, e.Message); + var response = new CmdResponse(cmdName, e.Message); OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response, statusReturn: StatusReturn.Failed)); } @@ -291,39 +290,39 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core { CyclicReceiveTaskLoopIsActive = true; // Get the process information - var infoRef = FM2014CmdDef.GetCmdInfo(FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR); - var infoDut = FM2014CmdDef.GetCmdInfo(FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR); + var infoRef = GetCmdInfo(CmdName.CMD_REF_GET_PLS_CTR); + var infoDut = GetCmdInfo(CmdName.CMD_DUT_GET_PLS_CTR); do { try { - cmdName = FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR; + cmdName = CmdName.CMD_REF_GET_PLS_CTR; if (refCtrOn && Write(cmdName)) { var refPulseStr = SerialPort.ReadTo($"{_eos}"); if (int.TryParse(refPulseStr, NumberStyles.HexNumber, new CultureInfo("en"), out var refPulses)) { - var response = new FM2014CmdDef.CmdResponse(cmdName, infoRef, refPulses); + var response = new CmdResponse(cmdName, infoRef, refPulses); OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(infoRef, specificInfoObj: response)); } } - cmdName = FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR; + cmdName = CmdName.CMD_DUT_GET_PLS_CTR; if (dutCtrOn && Write(cmdName)) { var dutPulseStr = SerialPort.ReadTo($"{_eos}"); if (int.TryParse(dutPulseStr, NumberStyles.HexNumber, new CultureInfo("en"), out var dutPulses)) { - var response = new FM2014CmdDef.CmdResponse(cmdName, infoDut, dutPulses); + var response = new CmdResponse(cmdName, infoDut, dutPulses); OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(infoDut, specificInfoObj: response)); } } } catch (Exception e) { - var response = new FM2014CmdDef.CmdResponse(cmdName, e.Message); + var response = new CmdResponse(cmdName, e.Message); OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response, statusReturn: StatusReturn.Failed)); } @@ -344,8 +343,8 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core public Boolean Login() { IsLoggedOn = false; - var cmdCode = FM2014CmdDef.GetCmdStr(FM2014CmdDef.CmdName.CMD_SERIAL); - const FM2014CmdDef.CmdName cmdName = FM2014CmdDef.CmdName.CMD_SERIAL; + var cmdCode = GetCmdStr(CmdName.CMD_SERIAL); + const CmdName cmdName = CmdName.CMD_SERIAL; try { // Establish connection to one specific FM2014 @@ -369,7 +368,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core } catch (Exception e) { - var response = new FM2014CmdDef.CmdResponse(cmdName, e.Message); + var response = new CmdResponse(cmdName, e.Message); OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response, statusReturn: StatusReturn.Failed)); } @@ -401,11 +400,22 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core return true; } - // Establish connection to all FM2014s with broadcast address - SerialPort.Write(FM2014CmdDef.BROADCAST_ADDRESS); - - BroadcastCommIsActive = true; - return true; + try + { + // Establish connection to all FM2014s with broadcast address + SerialPort.Write(BROADCAST_ADDRESS); + BroadcastCommIsActive = true; + return true; + } + catch (Exception e) + { + var response = new CmdResponse(CmdName.CMD_ADDR_PC, + $"{Resources.StrCmdRespErrorBroadcast} - {e.Message}"); + OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response, + statusReturn: StatusReturn.Failed)); + BroadcastCommIsActive = false; + return false; + } } /// @@ -428,18 +438,28 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core } } - - // Establish connection to one specific FM2014 - SerialPort.Write(AddressStr); - FullId = SerialPort.ReadTo(_eos); - - if (!string.IsNullOrEmpty(FullId)) + try { - FullId = FullId.Replace(_adrPre, ""); - var fields = FullId.Split('.'); - FwVersion = fields[1]; - BroadcastCommIsActive = false; - return true; + + // Establish connection to one specific FM2014 + SerialPort.Write(AddressStr); + FullId = SerialPort.ReadTo(_eos); + + if (!string.IsNullOrEmpty(FullId)) + { + FullId = FullId.Replace(_adrPre, ""); + var fields = FullId.Split('.'); + FwVersion = fields[1]; + BroadcastCommIsActive = false; + return true; + } + } + catch (Exception e) + { + var response = new CmdResponse(CmdName.CMD_ADDR_PC, + $"{Resources.StrCmdRespErrorIndividual} - {e.Message}"); + OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response, + statusReturn: StatusReturn.Failed)); } return false; @@ -453,7 +473,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core /// /// /// - public Boolean Write(FM2014CmdDef.CmdName cmdName, Object dataObj = null) + public Boolean Write(CmdName cmdName, Object dataObj = null) { if (SerialPort == null || !SerialPort.IsOpen) { @@ -465,7 +485,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core // Initiate communication using the individual or broadcast address var retVal = true; - if (FM2014CmdDef.CmdType.BROADCAST == FM2014CmdDef.GetCmdCmdType(cmdName)) + if (CmdType.BROADCAST == GetCmdCmdType(cmdName)) { if (!BroadcastCommIsActive) { @@ -483,7 +503,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core if (retVal) { // TODO THW Prepare data object - var cmdCodeStr = FM2014CmdDef.GetCmdStr(cmdName); + var cmdCodeStr = GetCmdStr(cmdName); SerialPort.Write($"{cmdCodeStr}{_eos}"); } @@ -504,20 +524,26 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core CyclicReceiveTaskLoopIsActive = false; // Reset measurement - var infoStr = FM2014CmdDef.GetCmdInfo(FM2014CmdDef.CmdName.CMD_RST_MEAS); - if (!Write(FM2014CmdDef.CmdName.CMD_RST_MEAS)) + var infoStr = GetCmdInfo(CmdName.CMD_RST_MEAS); + if (!Write(CmdName.CMD_RST_MEAS)) return false; // Wait until FM2014 calibration finished var resetDelayCtr_ms = 4000; const Int32 loopTime_ms = 500; + MaxActualProcessProgress = resetDelayCtr_ms / loopTime_ms; + ActualProcessProgress = 0; do { - var response = new FM2014CmdDef.CmdResponse(FM2014CmdDef.CmdName.CMD_RST_MEAS, infoStr, + var response = new CmdResponse(CmdName.CMD_RST_MEAS, infoStr, resetDelayCtr_ms); - OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(infoStr, specificInfoObj: response)); + OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(infoStr, + actualProcessMessage:infoStr, + actualProcessPercent: ActualProcessProgress, + specificInfoObj: response)); Thread.Sleep(loopTime_ms); resetDelayCtr_ms -= loopTime_ms; + ActualProcessProgress += 1; } while (resetDelayCtr_ms > 0); return true; diff --git a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.Designer.cs b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.Designer.cs index ed65e17e..1eafab56 100644 --- a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.Designer.cs +++ b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.Designer.cs @@ -466,6 +466,15 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr } } + /// + /// Looks up a localized string similar to Brodcast addressing failed. + /// + internal static string StrCmdRespErrorBroadcast { + get { + return ResourceManager.GetString("StrCmdRespErrorBroadcast", resourceCulture); + } + } + /// /// Looks up a localized string similar to Command not supported. /// @@ -484,6 +493,15 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr } } + /// + /// Looks up a localized string similar to Individual addressing failed. + /// + internal static string StrCmdRespErrorIndividual { + get { + return ResourceManager.GetString("StrCmdRespErrorIndividual", resourceCulture); + } + } + /// /// Looks up a localized string similar to Measurement incomplete. /// diff --git a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.de.resx b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.de.resx index 2577ce7b..cdb724ea 100644 --- a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.de.resx +++ b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.de.resx @@ -273,4 +273,10 @@ Auslesen Bootcodeinformation + + Broadcast Adressierung fehlgeschlagen + + + Individuelle Adressierung fehlgeschlagen + \ No newline at end of file diff --git a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.resx b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.resx index edc60bd0..3432b6db 100644 --- a/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.resx +++ b/Common/Hardware/WaterMeter/MechanicalMeter/FM2014/FM2014Core/Properties/Resources.resx @@ -273,4 +273,10 @@ Print boot code information + + Brodcast addressing failed + + + Individual addressing failed + \ No newline at end of file