laatzen/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterCheckFinalizationTask.cs
2025-01-24 12:10:40 +01:00

171 lines
8.2 KiB
C#

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<ComparePropertyAttribute>() != 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;
}
}
}