diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs index 6e5a9917..5afad7c5 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisMeter.cs @@ -234,6 +234,18 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore protected set; get; } + /// + public String MeterLength { + protected set; + get; + } = "?"; + + /// + public Boolean PressureSensorAssembled + { + protected set; get; + } + /// /// Radio frequency in MHz (433 or 868 or null). /// @@ -1423,6 +1435,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// - Frequency indicator == 0 means it is a NA-Region Octopus with EMEA FW installed. /// + /// + /// - Pressure sensor detection. + /// public void CheckRegionSizeLutCrc() { //read metrology lookup table CRC @@ -1440,6 +1455,17 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore LutCrc = Constants.StrUnknown; } + //read pressure sensor assembled + try + { + PressureSensorAssembled = RegisterConverter.ByteArrayToValue( + ReadRegister(Register.Metrologyasst.PressurePresent)); + } + catch (Exception)// exception will be thrown if register is not present + { + PressureSensorAssembled = false; + } + //read meter size MeterSize = MeterSizeConverter.ConvertMeterSizeEnumToSizeName( (MeterSize)RegisterConverter.ByteArrayToValue( diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/IGenesisMeter.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/IGenesisMeter.cs index ef84cf09..ef4a2715 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/IGenesisMeter.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/IGenesisMeter.cs @@ -94,6 +94,22 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore get; } + /// + /// Length of the meter. + /// + String MeterLength + { + get; + } + + /// + /// Pressure sensor assembled to meter. + /// + Boolean PressureSensorAssembled + { + get; + } + /// /// Region (EMEA, NA or China). /// diff --git a/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs b/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs index f113f773..1e8e30ff 100644 --- a/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs +++ b/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs @@ -157,6 +157,24 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.MockGenesis get => base.MeterSize; } + /// + /// Mock object can overwrite length for test purposes + /// + public new String MeterLength + { + set => base.MeterLength = value; + get => base.MeterLength; + } + + /// + /// Mock object can overwrite pressure sensor is assembled for test purposes + /// + public new Boolean PressureSensorAssembled + { + set => base.PressureSensorAssembled = value; + get => base.PressureSensorAssembled; + } + /// /// Mock object can overwrite FwVersion for test purposes /// diff --git a/Common/Hardware/WaterMeter/Genesis/Registers/Registers.cs b/Common/Hardware/WaterMeter/Genesis/Registers/Registers.cs index 408c9f2a..17c4d7e7 100644 --- a/Common/Hardware/WaterMeter/Genesis/Registers/Registers.cs +++ b/Common/Hardware/WaterMeter/Genesis/Registers/Registers.cs @@ -107,6 +107,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers { public static readonly String PulseEvenDistribution = "METROLOGYASST_PulseEvenDistribution"; public static readonly String PulseMode = "METROLOGYASST_PulseMode"; + public static readonly String PressurePresent = "METROLOGYASST_PressurePresent"; public static readonly String StoreConfiguration = "METROLOGYASST_StoreConfiguration"; } diff --git a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache index 9389613c..4163759b 100644 --- a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache +++ b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -7df2ad6be70922b931820861acc675522243ee78 +8cb55c312de586b683d72cf58c13e2801d10e14b767777d98338d3e1473a1213 diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/CheckOrderNumber.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs similarity index 99% rename from Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/CheckOrderNumber.cs rename to Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs index 3b4a7056..97b8bb64 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/CheckOrderNumber.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs @@ -4,7 +4,7 @@ using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Production.ProductionUiCordonel.Properties; using Xylem.Common.Production.ProductionUiCordonel.UserControls; -namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses { public class CheckOrderNumber : BaseProductionProcess { diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckProductionState.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckProductionState.cs index 2bd5c005..8918b640 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckProductionState.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckProductionState.cs @@ -6,8 +6,6 @@ using System.Windows; using LaaPackages.Features.Cordonel.Models; using Logic.ProductionToProductMapper.Files.Fw; using Xylem.Common.CommonCore.Consts; -using Xylem.Common.Hardware.WaterMeter.Genesis.Applications; -using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisStatus; @@ -16,6 +14,7 @@ using Xylem.Common.Logic.ProductionOrderCore.OrderData; using Xylem.Common.Logic.ProductionOrderCore.TestResults; using Xylem.Common.Production.ProductionUiCordonel.Model; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericModules; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; using Xylem.Common.Production.ProductionUiCordonel.Properties; @@ -315,6 +314,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// - Collect all requirement statuses before signalizing failed to summarize results starting with battery /// load. /// + /// + /// - Check radio signal levels in parameter list. + /// public override StatusReturn ExecuteProcess() { #region ----------------------------------- Check EOL Progress -------------------------------------------- @@ -404,6 +406,22 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr ActualProcessProgress++; #endregion + #region ----------------------------------- Check Kitron Radio Signal Levels ------------------------------ + + var statusReturn = CheckKitronRadioSignalLevels(out feedbackMsg); + if (StatusReturn.Failed == statusReturn) + { + ErrorMsgDispatcher(feedbackMsg); + return StatusReturn.Failed; + } + if (StatusReturn.Okay == statusReturn) + { + SuccessMsgDispatcher(feedbackMsg); + } + + ActualProcessProgress++; + #endregion + #region ----------------------------------- Check Firmware and Apps --------------------------------------- if (string.IsNullOrEmpty(CheckFwAndApps(out feedbackMsg))) @@ -506,7 +524,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // This step may exit with "skipped" here if "special-requirement" forces to skip the check of calibration. // All following checks will be skipped as well. - var statusReturn = CheckCalibrationValues(out feedbackMsg); + statusReturn = CheckCalibrationValues(out feedbackMsg); if (StatusReturn.Skipped == statusReturn) { WarningMsgDispatcher(feedbackMsg); @@ -855,6 +873,23 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr return EolProgress.ProductionStatusMeterSize; } + /// + /// Check the measurements from Kitron for this specific Cordonel if it is an EMEA region. + /// + /// Software Requirement Specification: + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_008]_Check_Kitron_Radio_Levels + /// + /// + /// + /// + /// + /// - Initial. + /// + private StatusReturn CheckKitronRadioSignalLevels(out String feedbackMsg) + { + return GenericChecks.CheckKitronRadioSignalLevels(Meter, RegisterRestorer, out feedbackMsg); + } + /// /// Check the installed firmware (FW) and all individual applications (Apps) installed to the meter: /// - Take the FLEXNETVERSION as base information which FW is installed in the Cordonel and compare this with @@ -866,7 +901,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// Cordonel operational system (Breeze). /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_008]_Check_FW_and_Apps + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_009]_Check_FW_and_Apps /// /// /// @@ -874,91 +909,23 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// /// - Extracted from for better testability. /// + /// + /// - Exported to generic tests. + /// private String CheckFwAndApps(out String feedbackMsg) { - feedbackMsg = ""; - // Check installed FW version with FLEXNET information - var fwUpdate = new MeterFwUpdate(Meter); - if (EolProgress == null || - Meter == null || - ProductionRequirements == null || - string.IsNullOrEmpty(ProductionRequirements.FwVersion) || - string.IsNullOrEmpty(Meter.FwVersion) || - !Meter.FwVersion.Equals(ProductionRequirements.FwVersion) || - // Check if FW package has been loaded and contains at least the minimal required files - FwUpdatePackage == null || - FwUpdatePackage.Count < MeterFwUpdate.MinAppsRequiredForOperation) + var fwCheckMsg = GenericChecks.CheckFwAndApps(Meter, ProductionRequirements, FwUpdatePackage, + out feedbackMsg); + + // Fill the EOL progress + if (string.IsNullOrEmpty(fwCheckMsg)) { if (EolProgress != null) EolProgress.ProductionStatusFwVersion = null; - feedbackMsg += $"{Resources.StrErrorMsgRequirementFw}\n"; return ""; } - - var fileApps = new List(); - if (FwUpdatePackage != null) - { - foreach (var file in FwUpdatePackage) - { - // load the ABC (application binary container) - if (file.FileName.Contains("binfile") && - file.FileName.EndsWith(".bin") && - // Sometimes the * complete *.bin is part of the binaries containing all app in one file. - // As this is not part of the ADF it has to be skipped from loading!!!! - !file.FileName.Contains("complete")) - { - var fileApplication = new FileApplications(file.FileName) - { - BinData = new List(file.FileContent.ToList()) - }; - fileApps.Add(fileApplication); - } - // Load the ADF (application description file, containing the information - // of each application) - else if (file.FileName.Contains("product") && file.FileName.EndsWith(".txt")) - { - var enc = new System.Text.ASCIIEncoding(); - var adf = enc.GetString(file.FileContent.ToArray()); - fwUpdate.LoadPackageFileFromText(adf); - } - } - - fwUpdate.LoadFileApps(fileApps); - } - - var checkSucceeded = true; - // Compare every installed application for version and CRC with the required to be defined by the downloaded - // ABC (application binary container) - fwUpdate.CompareAllMeterAndFileApps(); - - if (// Validate package description file with required Apps (fileApps) and build the CORE REVISIONS MIN MAX - !fwUpdate.ValidateFileAppsWithPackageFile() || - // Check if any meter Apps is outdated or does contain an un-matching CRC - Meter.MeterAppListVersion.Any(app => app.Status != MeterAppState.MeterAppUpToDate && - app.Status != MeterAppState.MeterAppNotRequired)) - { - feedbackMsg += $"{Resources.StrErrorMsgAppVersionOrCrc}\n"; - checkSucceeded = false; - // Do not immediately return to summarize all errors following up - } - - // The package description file has to be parsed in advance using the fwUpdate.ValidateFileAppsWithPackageFile()!! - if (!fwUpdate.CheckCoreRevision(Meter.CoreRevision)) - { - feedbackMsg += $"{Resources.StrErrorMsgCoreRevision}\n"; - // Do not immediately return to summarize all errors following up - checkSucceeded = false; - } - - if (!checkSucceeded) - { - EolProgress.ProductionStatusFwVersion = null; - feedbackMsg += $"{Resources.StrErrorMsgRequirementFw}\n"; - return EolProgress.ProductionStatusFwVersion; - } EolProgress.ProductionStatusFwVersion = Meter.FwVersion; - feedbackMsg = $"{Resources.StrSuccessMsgRequirementFw} - Firmware: {Meter.FwVersion}"; - return EolProgress.ProductionStatusFwVersion; + return fwCheckMsg; } /// @@ -974,7 +941,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// calculation is being used. /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_009]_Check_Remaining_Battery_Load + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_010]_Check_Remaining_Battery_Load /// /// /// @@ -1075,7 +1042,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// Check the remaining lifetime /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_010]_Check_Remaining_Lifetime + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_011]_Check_Remaining_Lifetime /// /// /// @@ -1139,7 +1106,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// Check the months between first battery activation and now /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_011]_Check_Storage_Months + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_012]_Check_Storage_Months /// /// /// @@ -1215,7 +1182,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// don't match, the check of valid range and set to default values doesn't come in focus! /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_012]_Check_Calibration_Values + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_013]_Check_Calibration_Values /// /// /// @@ -1366,7 +1333,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// the according step has been successfully executed. /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_013]_Check_Preadjustment + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_014]_Check_Preadjustment /// /// /// @@ -1428,7 +1395,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// the according step has been successfully executed. /// /// Software Requirement Specification: - /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_014]_Check_Flow_Test_State + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_015]_Check_Flow_Test_State /// /// /// diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/CheckSerialNumber.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckSerialNumber.cs similarity index 99% rename from Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/CheckSerialNumber.cs rename to Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckSerialNumber.cs index ba488770..b3f87824 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/CheckSerialNumber.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckSerialNumber.cs @@ -4,7 +4,7 @@ using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Production.ProductionUiCordonel.Properties; using Xylem.Common.Production.ProductionUiCordonel.UserControls; -namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses { public class CheckSerialNumber : BaseProductionProcess { diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs index 65fc798a..da4b4f3e 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs @@ -151,25 +151,6 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Kick off parallel process execution kickOffParallelState: ProcessState.GetProgrammingParameters), - // This scans the order number, it has to be executed exclusively with automatic - new ProcessStateStruct( - productionProcess: new CheckOrderNumber(Resources.StrStateCheckOrderNumber), - processState: ProcessState.CheckOrderNumber, - processInfo: Resources.StrStateCheckOrderNumber, - productionProcessNo: 11, - nextStateOnSuccess: ProcessState.CheckSerialNumber), - - // This scans the serial number, it has to be executed exclusively with automatic - new ProcessStateStruct( - productionProcess: new CheckSerialNumber( Resources.StrStateCheckSerialNumber), - processState: ProcessState.CheckSerialNumber, - processInfo: Resources.StrStateCheckSerialNumber, - productionProcessNo: 12, - nextStateOnSuccess: ProcessState.CheckAttachments), - - #endregion -------------------------------- GENERIC-STATES -------------------------------------------- - - #region ----------------------------------- EOL-STATES ------------------------------------------------ // Precondition: - The connection process has to be completed as a readout of some register // values from the Cordonel are needed to check the update capability: // - Wait on completed connection process before starting this process. @@ -186,6 +167,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Wait until this process has been successfully completed waitForSingleProcess: ProcessState.ConnectCordonel), + #endregion -------------------------------- GENERIC-STATES -------------------------------------------- + + #region ----------------------------------- EOL-STATES ------------------------------------------------ // Precondition: - The connection process has to be completed as a readout of some register // values from the Cordonel are needed to check the update capability: // - Wait on completed connection process before starting this process. @@ -201,7 +185,6 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr kickOffParallelState: ProcessState.ProcessPasswordFile, // Wait until this process has been successfully completed waitForSingleProcess: ProcessState.ConnectCordonel), - // Precondition: - The connection process has to be completed as a password change in the DB // will take place: Skeleton to Password Level 8. Not waiting for completion may cause side @@ -265,6 +248,22 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr productionProcessNo: 10, nextStateOnSuccess: ProcessState.CheckOrderNumber), + // This scans the order number, it has to be executed exclusively with automatic + new ProcessStateStruct( + productionProcess: new CheckOrderNumber(Resources.StrStateCheckOrderNumber), + processState: ProcessState.CheckOrderNumber, + processInfo: Resources.StrStateCheckOrderNumber, + productionProcessNo: 11, + nextStateOnSuccess: ProcessState.CheckSerialNumber), + + // This scans the serial number, it has to be executed exclusively with automatic + new ProcessStateStruct( + productionProcess: new CheckSerialNumber( Resources.StrStateCheckSerialNumber), + processState: ProcessState.CheckSerialNumber, + processInfo: Resources.StrStateCheckSerialNumber, + productionProcessNo: 12, + nextStateOnSuccess: ProcessState.CheckAttachments), + // Precondition: - All checks have to be executed with positive result new ProcessStateStruct( productionProcess: new CheckAttachments(Resources.StrStateCheckAttachments), diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs index b17d558d..cc882cba 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs @@ -3,6 +3,7 @@ using System.Linq; using LaaPackages.Features.Cordonel.Models; using Xylem.Common.CommonCore.Consts; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; using Xylem.Common.Production.ProductionUiCordonel.Properties; namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs new file mode 100644 index 00000000..7bb35539 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs @@ -0,0 +1,164 @@ +using LaaPackages.Features.Cordonel.Models; +using Logic.ProductionToProductMapper.Files.Fw; +using System; +using System.Collections.Generic; +using System.Linq; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.Applications; +using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; +using Xylem.Common.Production.ProductionUiCordonel.Properties; + +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericModules +{ + internal static class GenericChecks + { + /// + /// Check the measurements from Kitron for this specific Cordonel if it is an EMEA region. + /// + /// + /// + /// + /// + /// + /// - Initial. + /// + /// + /// - Import from CheckProductionState for common use. + /// + public static StatusReturn CheckKitronRadioSignalLevels(IGenesisMeter meter, RegisterRestorer registerRestorer, + out String feedbackMsg) + { + feedbackMsg = ""; + if (meter == null || + string.IsNullOrEmpty(meter.MeterSize) || + string.IsNullOrEmpty(meter.Region)) + { + return StatusReturn.Failed; + } + // The NA region has no radio + if (meter.Region.Equals("NA")) + { + return StatusReturn.Skipped; + } + + // On unknown radio signal level parameters from Kitron those are not in the list of the programming parameters + if (!registerRestorer.RecoveryRegisters.Any(x => x.RegisterIdent.Equals("SENSUSRADIO_PowerLevel"))) + { + var pressureSensorAssembled = meter.PressureSensorAssembled ? + $", {Resources.StrLblPressureSensorAssembledTxt}": + ""; + feedbackMsg = $"{Resources.StrErrorMsgRadioSignalLevels} " + + $"{Resources.StrLblRadioFrequencyTxt}: {meter.RadioFrequencyMhz} MHz," + + $"{Resources.StrLblMeterSizeTxt}: {meter.MeterSize}, " + + $"{Resources.StrLblMeterLengthTxt}: {meter.MeterLength} mm" + + $"{pressureSensorAssembled}"; + return StatusReturn.Failed; + } + feedbackMsg = Resources.StrSuccessMsgRadioSignalLevels; + return StatusReturn.Okay; + } + + /// + /// Check the installed firmware (FW) and all individual applications (Apps) installed to the meter: + /// - Take the FLEXNETVERSION as base information which FW is installed in the Cordonel and compare this with + /// the production-requirement, + /// - The downloaded FW package containing all Apps as application-binary-container (ABC) will be compared with + /// the reported Apps by the Cordonel for their version and CRC using the " class, + /// - Crosscheck if the application-description-file (ADF) states all Apps which are installed in the Cordonel, + /// - Check the Core-Revision of the Cordonel against the ADF to guarantee that this FW is supported by the + /// Cordonel operational system (Breeze). + /// + /// + /// + /// + /// + /// + /// + /// - Initial. + /// + /// + /// - Import from CheckProductionState for common use. + /// + public static String CheckFwAndApps(IGenesisMeter meter, CordonelRequirements requirements, + List fwUpdatePackage, out String feedbackMsg) + { + feedbackMsg = ""; + // Check installed FW version with FLEXNET information + var fwUpdate = new MeterFwUpdate(meter); + if (meter == null || + requirements == null || + string.IsNullOrEmpty(requirements.FwVersion) || + string.IsNullOrEmpty(meter.FwVersion) || + !meter.FwVersion.Equals(requirements.FwVersion) || + // Check if FW package has been loaded and contains at least the minimal required files + fwUpdatePackage == null || + fwUpdatePackage.Count < MeterFwUpdate.MinAppsRequiredForOperation) + { + feedbackMsg += $"{Resources.StrErrorMsgRequirementFw}\n"; + return ""; + } + + var fileApps = new List(); + foreach (var file in fwUpdatePackage) + { + // load the ABC (application binary container) + if (file.FileName.Contains("binfile") && + file.FileName.EndsWith(".bin") && + // Sometimes the * complete *.bin is part of the binaries containing all app in one file. + // As this is not part of the ADF it has to be skipped from loading!!!! + !file.FileName.Contains("complete")) + { + var fileApplication = new FileApplications(file.FileName) + { + BinData = new List(file.FileContent.ToList()) + }; + fileApps.Add(fileApplication); + } + // Load the ADF (application description file, containing the information + // of each application) + else if (file.FileName.Contains("product") && file.FileName.EndsWith(".txt")) + { + var enc = new System.Text.ASCIIEncoding(); + var adf = enc.GetString(file.FileContent.ToArray()); + fwUpdate.LoadPackageFileFromText(adf); + } + } + + fwUpdate.LoadFileApps(fileApps); + + var checkSucceeded = true; + // Compare every installed application for version and CRC with the required to be defined by the downloaded + // ABC (application binary container) + fwUpdate.CompareAllMeterAndFileApps(); + + if (// Validate package description file with required Apps (fileApps) and build the CORE REVISIONS MIN MAX + !fwUpdate.ValidateFileAppsWithPackageFile() || + // Check if any meter Apps is outdated or does contain an un-matching CRC + meter.MeterAppListVersion.Any(app => app.Status != MeterAppState.MeterAppUpToDate && + app.Status != MeterAppState.MeterAppNotRequired)) + { + feedbackMsg += $"{Resources.StrErrorMsgAppVersionOrCrc}\n"; + checkSucceeded = false; + // Do not immediately return to summarize all errors following up + } + + // The package description file has to be parsed in advance using the fwUpdate.ValidateFileAppsWithPackageFile()!! + if (!fwUpdate.CheckCoreRevision(meter.CoreRevision)) + { + feedbackMsg += $"{Resources.StrErrorMsgCoreRevision}\n"; + // Do not immediately return to summarize all errors following up + checkSucceeded = false; + } + + if (!checkSucceeded) + { + feedbackMsg += $"{Resources.StrErrorMsgRequirementFw}\n"; + return ""; + } + feedbackMsg = $"{Resources.StrSuccessMsgRequirementFw} - Firmware: {meter.FwVersion}"; + return meter.FwVersion; + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/GetFinalParametrization.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetFinalParametrization.cs similarity index 99% rename from Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/GetFinalParametrization.cs rename to Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetFinalParametrization.cs index e08cafe3..aeb4c482 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/GetFinalParametrization.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetFinalParametrization.cs @@ -7,10 +7,10 @@ using Xylem.Common.CommonCore.Consts; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Logic.SoftwareAccessHelper; -using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses; using Xylem.Common.Production.ProductionUiCordonel.Properties; -namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses { /// /// Request for parameters for final programming including VAKO and CSD diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs new file mode 100644 index 00000000..7fc4b88f --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs @@ -0,0 +1,96 @@ +using System; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; +using Xylem.Common.Production.ProductionUiCordonel.Properties; +using Xylem.Common.Production.ProductionUiCordonel.UserControls; + +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.PickingProcesses +{ + public class CheckOrderNumber : BaseProductionProcess + { + // string from scanner with string delimiter + private String _scan = ""; + // marker for scan input received + private Boolean _scanInputReceived; + /// + /// Ctor + /// + public CheckOrderNumber(String name) : base( name) + { + } + + /// + protected override void InitUserControl() + { + UserControl = new UcBarcodeInput + { + lblHeadLine = { Content = Resources.StrInstructionScanOrder }, + tbxScan = { Text = "" } + }; + } + + /// + /// Event handler taking the input from text box which should be scanned but also can be input manually. + /// + /// + /// + /// - Initial + /// + private void UserControlInput_Handler(Object sender, String input) + { + _scan = input; + _scanInputReceived = true; + } + + /// + /// Scanning of order number from production order sheet and comparing with DB. + /// + /// + /// + /// - Initial + /// + /// + /// - Removed signals for and as + /// these will be automatically set based on return value in + /// . + /// + public override StatusReturn ExecuteProcess() + { + if (Meter == null) + { + return StatusReturn.Failed; + } + + SignalRunningState(); + + if (UserControl == null) + { + ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); + return StatusReturn.Failed; + } + + var ucBarCode = (UcBarcodeInput)UserControl; + ucBarCode.OnBarcodeInput += UserControlInput_Handler; + + // set focus to text input for scanner + ucBarCode.FocusMe(); + _scanInputReceived = false; + + // wait for new line + while (!_scanInputReceived) + { + } + + ucBarCode.OnBarcodeInput -= UserControlInput_Handler; + + if (!string.IsNullOrEmpty(_scan) && _scan.Length > 5) + { + //TODO Roland, Do something with the scanned order + return StatusReturn.Okay; + } + + ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); + return StatusReturn.Failed; + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckProductionState.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckProductionState.cs index 1da6479e..75f02dde 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckProductionState.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckProductionState.cs @@ -1,15 +1,13 @@ -using System; +using Logic.ProductionToProductMapper.Files.Fw; +using System; using System.Collections.Generic; -using System.Linq; using System.Windows; -using Logic.ProductionToProductMapper.Files.Fw; using Xylem.Common.CommonCore.Consts; -using Xylem.Common.Hardware.WaterMeter.Genesis.Applications; -using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisStatus; using Xylem.Common.Logic.ProductionOrderCore.OrderData; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericModules; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; using Xylem.Common.Production.ProductionUiCordonel.Properties; @@ -229,6 +227,22 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki ActualProcessProgress++; #endregion + #region ----------------------------------- Check Kitron Radio Signal Levels ------------------------------ + + statusReturn = CheckKitronRadioSignalLevels(out feedbackMsg); + if (StatusReturn.Failed == statusReturn) + { + ErrorMsgDispatcher(feedbackMsg); + return StatusReturn.Failed; + } + if (StatusReturn.Okay == statusReturn) + { + SuccessMsgDispatcher(feedbackMsg); + } + + ActualProcessProgress++; + #endregion + #region ----------------------------------- Check Firmware and Apps --------------------------------------- if (string.IsNullOrEmpty(CheckFwAndApps(out feedbackMsg))) @@ -531,6 +545,24 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki return ProductionRequirements.MeterSize; } + /// + /// Check the measurements from Kitron for this specific Cordonel if it is an EMEA region. + /// + /// Software Requirement Specification: + /// [SRS_TBF_EOL_PP_CHECK_PROD_STATE_007]_Check_Kitron_Radio_Levels + /// + /// + /// + /// + /// + /// - Initial. + /// + private StatusReturn CheckKitronRadioSignalLevels(out String feedbackMsg) + { + return GenericChecks.CheckKitronRadioSignalLevels(Meter, RegisterRestorer, out feedbackMsg); + } + + /// /// Check the installed firmware (FW) and all individual applications (Apps) installed to the meter: /// - Take the FLEXNETVERSION as base information which FW is installed in the Cordonel and compare this with @@ -542,7 +574,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki /// Cordonel operational system (Breeze). /// /// Software Requirement Specification: - /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_007]_Check_FW_and_Apps + /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_008]_Check_FW_and_Apps /// /// /// @@ -550,86 +582,12 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki /// /// - Initial. /// + /// + /// - Exported to generic tests. + /// private String CheckFwAndApps(out String feedbackMsg) { - feedbackMsg = ""; - // Check installed FW version with FLEXNET information - var fwUpdate = new MeterFwUpdate(Meter); - if (Meter == null || - ProductionRequirements == null || - string.IsNullOrEmpty(ProductionRequirements.FwVersion) || - string.IsNullOrEmpty(Meter.FwVersion) || - !Meter.FwVersion.Equals(ProductionRequirements.FwVersion) || - // Check if FW package has been loaded and contains at least the minimal required files - FwUpdatePackage == null || - FwUpdatePackage.Count < MeterFwUpdate.MinAppsRequiredForOperation) - { - feedbackMsg += $"{Resources.StrErrorMsgRequirementFw}\n"; - return ""; - } - - var fileApps = new List(); - if (FwUpdatePackage != null) - { - foreach (var file in FwUpdatePackage) - { - // load the ABC (application binary container) - if (file.FileName.Contains("binfile") && - file.FileName.EndsWith(".bin") && - // Sometimes the * complete *.bin is part of the binaries containing all app in one file. - // As this is not part of the ADF it has to be skipped from loading!!!! - !file.FileName.Contains("complete")) - { - var fileApplication = new FileApplications(file.FileName) - { - BinData = new List(file.FileContent.ToList()) - }; - fileApps.Add(fileApplication); - } - // Load the ADF (application description file, containing the information - // of each application) - else if (file.FileName.Contains("product") && file.FileName.EndsWith(".txt")) - { - var enc = new System.Text.ASCIIEncoding(); - var adf = enc.GetString(file.FileContent.ToArray()); - fwUpdate.LoadPackageFileFromText(adf); - } - } - - fwUpdate.LoadFileApps(fileApps); - } - - var checkSucceeded = true; - // Compare every installed application for version and CRC with the required to be defined by the downloaded - // ABC (application binary container) - fwUpdate.CompareAllMeterAndFileApps(); - - if (// Validate package description file with required Apps (fileApps) and build the CORE REVISIONS MIN MAX - !fwUpdate.ValidateFileAppsWithPackageFile() || - // Check if any meter Apps is outdated or does contain an un-matching CRC - Meter.MeterAppListVersion.Any(app => app.Status != MeterAppState.MeterAppUpToDate && - app.Status != MeterAppState.MeterAppNotRequired)) - { - feedbackMsg += $"{Resources.StrErrorMsgAppVersionOrCrc}\n"; - checkSucceeded = false; - // Do not immediately return to summarize all errors following up - } - - // The package description file has to be parsed in advance using the fwUpdate.ValidateFileAppsWithPackageFile()!! - if (!fwUpdate.CheckCoreRevision(Meter.CoreRevision)) - { - feedbackMsg += $"{Resources.StrErrorMsgCoreRevision}\n"; - // Do not immediately return to summarize all errors following up - checkSucceeded = false; - } - - if (!checkSucceeded) - { - feedbackMsg += $"{Resources.StrErrorMsgRequirementFw}\n"; - return ""; - } - feedbackMsg = $"{Resources.StrSuccessMsgRequirementFw} - Firmware: {Meter.FwVersion}"; - return Meter.FwVersion; + return GenericChecks.CheckFwAndApps(Meter, ProductionRequirements, FwUpdatePackage, out feedbackMsg); } /// @@ -645,7 +603,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki /// calculation is being used. /// /// Software Requirement Specification: - /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_008]_Check_Remaining_Battery_Load + /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_009]_Check_Remaining_Battery_Load /// /// /// @@ -734,7 +692,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki /// Check the remaining lifetime /// /// Software Requirement Specification: - /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_009]_Check_Remaining_Lifetime + /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_010]_Check_Remaining_Lifetime /// /// /// @@ -785,7 +743,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki /// Check the months between first battery activation and now /// /// Software Requirement Specification: - /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_010]_Check_Storage_Months + /// [SRS_TBF_PICK_PP_CHECK_PROD_STATE_011]_Check_Storage_Months /// /// /// diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs index 2e124893..c75993b3 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs @@ -146,20 +146,33 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki processState: ProcessState.GetSerialNumberAndRadioAddress, processInfo: Resources.StrStateGetSerialAndRadioAddress, productionProcessNo: 2, - nextStateOnSuccess: ProcessState.CheckOrderNumber, - waitForAllProcesses: true), - + // Avoid automatic change after completion as parallel process is active + nextStateOnSuccess: BaseProductionProcess.DoNotChangeStateAfterCompletion, + // Kick off parallel process execution + kickOffParallelState: ProcessState.GetProgrammingParameters), + + // Precondition: - The connection process has to be completed as a readout of some register + // values from the Cordonel are needed to check the update capability: + // - Wait on completed connection process before starting this process. + new ProcessStateStruct( + productionProcess: new GetFinalParametrization(Resources.StrStateGetProgrammingParameters), + processState: ProcessState.GetProgrammingParameters, + processInfo: Resources.StrStateGetProgrammingParameters, + productionProcessNo: 3, + nextStateOnSuccess: ProcessState.CheckOrderNumber, + // Wait until this process has been successfully completed + waitForSingleProcess: ProcessState.ConnectCordonel), + #endregion -------------------------------- GENERIC-STATES -------------------------------------------- + + #region ----------------------------------- PICKING-STATES -------------------------------------------- // This scans the order number, it has to be executed exclusively with automatic new ProcessStateStruct( productionProcess: new CheckOrderNumber(Resources.StrStateCheckOrderNumber), processState: ProcessState.CheckOrderNumber, processInfo: Resources.StrStateCheckOrderNumber, - productionProcessNo: 3, + productionProcessNo: 4, nextStateOnSuccess: ProcessState.CheckProductionState), - #endregion -------------------------------- GENERIC-STATES -------------------------------------------- - - #region ----------------------------------- PICKING-STATES -------------------------------------------- // Precondition: - The connection process has to be completed as a readout of some register // values from the Cordonel are needed to check the update capability: // - Wait on completed connection process before starting this process. @@ -167,7 +180,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki productionProcess: new CheckProductionState(Resources.StrStateCheckProductionState), processState: ProcessState.CheckProductionState, processInfo: Resources.StrStateCheckProductionState, - productionProcessNo: 4, + productionProcessNo: 5, nextStateOnSuccess: ProcessState.Idle), //TODO Roland: implement your states here diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs index 5ff2e2e4..a416f514 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs @@ -9,7 +9,6 @@ using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisStatus; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EventArgs; -using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; using Timer = System.Threading.Timer; namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses diff --git a/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj b/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj index 49bba7fa..03219dad 100644 --- a/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj +++ b/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj @@ -285,6 +285,7 @@ + @@ -298,6 +299,7 @@ + @@ -311,12 +313,12 @@ - - + + - + diff --git a/Common/Production/ProductionUiCordonel/Properties/Resources.Designer.cs b/Common/Production/ProductionUiCordonel/Properties/Resources.Designer.cs index 128dfc26..a7a199bc 100644 --- a/Common/Production/ProductionUiCordonel/Properties/Resources.Designer.cs +++ b/Common/Production/ProductionUiCordonel/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -672,6 +672,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.Properties { } } + /// + /// Looks up a localized string similar to ERROR: Missing radio signal levels from Kitron!. + /// + internal static string StrErrorMsgRadioSignalLevels { + get { + return ResourceManager.GetString("StrErrorMsgRadioSignalLevels", resourceCulture); + } + } + /// /// Looks up a localized string similar to ERROR: Read failed. /// @@ -1050,6 +1059,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.Properties { } } + /// + /// Looks up a localized string similar to Meter Length. + /// + internal static string StrLblMeterLengthTxt { + get { + return ResourceManager.GetString("StrLblMeterLengthTxt", resourceCulture); + } + } + /// /// Looks up a localized string similar to Meter Size. /// @@ -1095,6 +1113,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.Properties { } } + /// + /// Looks up a localized string similar to Pressure Sensor Assembled. + /// + internal static string StrLblPressureSensorAssembledTxt { + get { + return ResourceManager.GetString("StrLblPressureSensorAssembledTxt", resourceCulture); + } + } + /// /// Looks up a localized string similar to RadioAddress. /// @@ -1113,6 +1140,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.Properties { } } + /// + /// Looks up a localized string similar to Radio Frequency. + /// + internal static string StrLblRadioFrequencyTxt { + get { + return ResourceManager.GetString("StrLblRadioFrequencyTxt", resourceCulture); + } + } + /// /// Looks up a localized string similar to SerialNumber. /// @@ -1941,6 +1977,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.Properties { } } + /// + /// Looks up a localized string similar to Success: Cordonel radio signal levels successfully loaded. + /// + internal static string StrSuccessMsgRadioSignalLevels { + get { + return ResourceManager.GetString("StrSuccessMsgRadioSignalLevels", resourceCulture); + } + } + /// /// Looks up a localized string similar to Success: Successfully read. /// diff --git a/Common/Production/ProductionUiCordonel/Properties/Resources.de.resx b/Common/Production/ProductionUiCordonel/Properties/Resources.de.resx index f369a09e..7c87569e 100644 --- a/Common/Production/ProductionUiCordonel/Properties/Resources.de.resx +++ b/Common/Production/ProductionUiCordonel/Properties/Resources.de.resx @@ -400,6 +400,12 @@ Baugröße + + Baulänge + + + Drucksensor eingebaut + Kitron Produktionsdatum @@ -412,6 +418,9 @@ Monate + + Funkfrequenz + Funkadresse @@ -619,6 +628,9 @@ FEHLER: Falsche Nennweite + + FEHLER: Fehlende Funksignalpegel von Kitron! + FEHLER: Falsche Produktionsnummer @@ -679,6 +691,9 @@ Erfolg: Maximale Lagerzeit eingehalten + + Erfolg: Cordonel Funksignalpegel erfolgreich geladen + Erfolg: Nennweite erfolgreich validiert diff --git a/Common/Production/ProductionUiCordonel/Properties/Resources.resx b/Common/Production/ProductionUiCordonel/Properties/Resources.resx index 2a3d91c6..07bb7245 100644 --- a/Common/Production/ProductionUiCordonel/Properties/Resources.resx +++ b/Common/Production/ProductionUiCordonel/Properties/Resources.resx @@ -400,6 +400,12 @@ Meter Size + + Meter Length + + + Pressure Sensor Assembled + Kitron production date @@ -412,6 +418,9 @@ Months + + Radio Frequency + RadioAddress @@ -616,9 +625,12 @@ ERROR: Maximum Storage Month or battery assembly date unknown - + ERROR: Requirement Meter Size does not match + + ERROR: Missing radio signal levels from Kitron! + ERROR: Requirement Production Order does not match @@ -679,6 +691,9 @@ Success: Requirement for maximum storage time kept + + Success: Cordonel radio signal levels successfully loaded + Success: Requirement and Cordonel meter size successfully validated