namespace Common.Hardware.WaterMeter.eRegister { using Common.Hardware.Ports; using Common.Hardware.SIRT; using Common.Hardware.WaterMeter.eRegister.Attributes; using Common.Hardware.WaterMeter.eRegister.Features; using Common.Hardware.WaterMeter.eRegister.Models; using System; using System.Linq; using System.Reflection; using System.Windows.Forms; public class EregisterCheckFinalizationTask : EregisterTask { private readonly EregisterProgrammingParameters requestParameters; private SIRTTaskState pendingState; public EregisterCheckFinalizationTask(EregisterProgrammingParameters requestParameters, int frequency) : base(frequency) { this.requestParameters = requestParameters; this.pendingState = SIRTTaskState.Completed; this.Name = "Final Check"; this.Data = new RequestDebugTelegram() .Append(new ProvidePin { AuthLevel = AuthLevel.III }); } protected override void EndProcessResponse(SIRTMessage response) { this.timeoutTimer.Stop(); if (this.State == this.pendingState) { this.State = SIRTTaskState.Running; this.Name = "Final Check - ✓"; var errors = string.Empty; if (this.DEBUG != null && this.SEMI != null) { var responseParameters = this.GetProgrammingParameters(); var comparebleProperties = typeof(EregisterProgrammingParameters) .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(x => x.GetCustomAttribute() != null); foreach (var property in comparebleProperties) { var requestValue = $"{property.GetValue(this.requestParameters)}" .ToString() .Trim('\0') .Trim(); var responseValue = $"{property.GetValue(responseParameters)}" .ToString() .Trim('\0') .Trim(); if (requestValue != responseValue) { errors += $"- {property.Name}: request value {requestValue} != response value {responseValue}{Environment.NewLine}"; } } var volumeDifference = Math.Abs((int)this.requestParameters.DisplayVolume - (int)responseParameters.DisplayVolume); if (volumeDifference > 10) { errors += $"- {nameof(this.requestParameters.DisplayVolume)}: request value {this.requestParameters.DisplayVolume} != response value {responseParameters.DisplayVolume}{Environment.NewLine}"; } } if (errors.Length > 0) { errors += $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}Möchten Sie mit der Prüfungsabschluss fortfahren (Ja), oder Abbrechen (Nein)?{Environment.NewLine}"; errors = $"Am Einbauplatz: {this.SlotNr}, " + $"eingebaute E-Register mit Funkadressen: {this.RequestAddress} | {this.ResponseAddress}, " + $"sind folgenden Fehler aufgetreten:{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}{errors}"; var result = MessageBox.Show(errors, $"Fehler bei der Prüfungsabschluss", MessageBoxButtons.YesNo); if (result == DialogResult.No) { this.pendingState = SIRTTaskState.Cancelled; this.Label = nameof(SIRTTaskState.Cancelled); this.Name = "Final Check ✘"; } } } this.State = this.pendingState; this.timeoutTimer.Start(); base.EndProcessResponse(response); } private EregisterProgrammingParameters GetProgrammingParameters() { var alarms = new AlarmsMask(this.SEMI.AlarmActiveInformation); var dataLogContent = new ChangeDataLoggerSettings(); dataLogContent.SetLogContent(this.SEMI.LogContent); var fdrLogContent = new ChangeDataLoggerSettings(); fdrLogContent.SetLogContent(this.SEMI.FixedDateReadingContent); var parameters = new EregisterProgrammingParameters { VolumePerLedPulse = this.DEBUG.VolumePerLedPulse, VolumePerPulse = this.DEBUG.VolumePerPulse, OffsetFactor = (byte)this.DEBUG.OffsetFactor, OffsetTime = this.DEBUG.OffsetTime, FactoryCalibration = (byte)(this.DEBUG.FactoryCalibration * 10), UnitsOfMessureSEMI = (byte)this.SEMI.Units, MeterSize = this.SEMI.MeterSize, Alarm_Backflow = alarms.Backflow, Alarm_Broken_Pipe = alarms.BrokenPipe, Alarm_Leakage = alarms.Leak, Alarm_Low_Battery = alarms.LowBattery, Alarm_Magnetic_Tamper = alarms.MagneticTamper, Alarm_Medium_Absent = alarms.MediumAbsent, Alarm_Metrology_Unavailable = alarms.MetrologyUnavailable, Alarm_Specific_Error = alarms.SpecificError, MeterId = this.SEMI.MeterID, Data_Logging_Period = this.SEMI.LoggingInterval, Data_Logging_Alarm_State = dataLogContent.AlarmState, Data_Logging_Backward_Volume = dataLogContent.BackwardVolume, Data_Logging_Broken_Pipe_Flow = dataLogContent.BrokenPipeFlow, Data_Logging_Counter = dataLogContent.Counter, Data_Logging_Current_Flow = dataLogContent.CurrentFlow, Data_Logging_Forward_Counter = dataLogContent.ForwardCounter, Data_Logging_Maximum_Flow = dataLogContent.MaximumFlow, Data_Logging_Minimum_Flow = dataLogContent.MinimumFlow, Data_Logging_Peak_Flow = dataLogContent.PeakFlow, Data_Logging_Time_Of_Broken_Pipe = dataLogContent.TimeOfBrokenPipe, Data_Logging_Time_Of_Maximum_Flow = dataLogContent.TimeOfMaximumFlow, Data_Logging_Time_Of_Minimum_Flow = dataLogContent.TimeOfMinimumFlow, Data_Logging_Time_Of_Peak_Flow = dataLogContent.TimeOfPeakFlow, History_Error_Limits_Days = this.SEMI.HistoricalErrorLimit, CustomerSpecificText = this.SEMI.CustomerSpecificText, DisplayVolume = this.SEMI.DisplayVolume, LeakagePeriod = this.SEMI.LeakageDetectionParameters.GetBitsLE().GetByteLE(0, 3), // TODO: LeakageThreshold BrokenPipePeriod = this.SEMI.BrokenPipeDetectionParameters.GetBitsLE().GetByteLE(0, 3), // TODO: BrokenPipeThreshold FDR_Day_Of_Data_Reading = this.SEMI.DayOfMonth, FDR_Alarm_State = fdrLogContent.AlarmState, FDR_Backward_Volume = fdrLogContent.BackwardVolume, FDR_Broken_Pipe_Flow = fdrLogContent.BrokenPipeFlow, FDR_Counter = fdrLogContent.Counter, FDR_Current_Flow = fdrLogContent.CurrentFlow, FDR_Forward_Counter = fdrLogContent.ForwardCounter, FDR_Maximum_Flow = fdrLogContent.MaximumFlow, FDR_Minimum_Flow = fdrLogContent.MinimumFlow, FDR_Peak_Flow = fdrLogContent.PeakFlow, FDR_Time_Of_Broken_Pipe = fdrLogContent.TimeOfBrokenPipe, FDR_Time_Of_Maximum_Flow = fdrLogContent.TimeOfMaximumFlow, FDR_Time_Of_Minimum_Flow = fdrLogContent.TimeOfMinimumFlow, FDR_Time_Of_Peak_Flow = fdrLogContent.TimeOfPeakFlow, TransmissionIntervalFinal = (byte)this.SEMI.TransmissionInterval, LATWindowsFinal = this.SEMI.LATInterval, MBusStatus = this.SEMI.MBusStatus, Adresse = this.SEMI.Address, }; return parameters; } } }