171 lines
8.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|