Files
laatzen/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs
T

174 lines
5.6 KiB
C#

namespace Common.Hardware.WaterMeter.eRegister
{
using Common.Hardware.SIRT;
using Common.Hardware.SIRT.Parameters;
using Common.Hardware.WaterMeter.eRegister.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
public class Eregister
{
private readonly EregisterFeatures features;
private readonly Action<SIRTTask> enqueueTask;
private readonly Queue<EregisterTask> runningTasks;
private readonly Queue<EregisterTask> completedTasks;
public Eregister(EregisterFeatures features, Action<SIRTTask> enqueueTask)
{
this.features = features;
this.enqueueTask = enqueueTask;
this.runningTasks = new Queue<EregisterTask>();
this.completedTasks = new Queue<EregisterTask>();
}
public uint Address => this.features?.RequestAddress ?? 4291189262;
public void Clear()
{
this.runningTasks.Clear();
this.completedTasks.Clear();
}
internal IEnumerable<EregisterTask> LoadCustomTasks(EregisterProgrammingParameters parameters)
{
this.LoadProgrammingParameters();
return this.runningTasks.AsEnumerable();
}
internal IEnumerable<EregisterTask> LoadInspectionFinalizationTasks(EregisterProgrammingParameters parameters)
{
this.LoadProgrammingParameters();
this.runningTasks.Enqueue(new EregisterCheckFinalizationTask(parameters, this.features.Frequency)
{
SlotNr = this.features.SlotNr,
PoNr = this.features.PoNr,
SerialNr = this.features.SerialNr,
P1 = new P811
{
DelPamSemi = true,
},
RequestAddress = this.features.RequestAddress,
ResponseAddress = this.features.ResponseAddress,
EncryptionKey = this.features.EncryptionKey
});
return this.runningTasks.AsEnumerable();
}
internal IEnumerable<EregisterTask> LoadInspectionInitializationTasks(EregisterProgrammingParameters parameters)
{
this.LoadProgrammingParameters();
this.runningTasks.Enqueue(new EregisterCheckInitializationTask(parameters, this.features.Frequency)
{
SlotNr = this.features.SlotNr,
PoNr = this.features.PoNr,
SerialNr = this.features.SerialNr,
P1 = new P811
{
DelPamSemi = true,
},
RequestAddress = this.features.RequestAddress,
ResponseAddress = this.features.ResponseAddress,
EncryptionKey = this.features.EncryptionKey
});
return this.runningTasks.AsEnumerable();
}
internal void StartProgramming()
{
var manualResetEventSlim = new ManualResetEventSlim();
void Completed(SIRTTask _task)
{
if (_task is EregisterTask task)
{
task.Completed -= Completed;
task.Cancelled -= Cancelled;
}
if (this.runningTasks.Count > 0)
{
task = this.runningTasks.Dequeue();
this.completedTasks.Enqueue(task);
if (this.runningTasks.Count == 0)
{
manualResetEventSlim.Set();
}
}
}
void Cancelled(SIRTTask _task)
{
if (_task is EregisterTask task)
{
task.Completed -= Completed;
task.Cancelled -= Cancelled;
}
manualResetEventSlim.Set();
}
foreach (var task in this.runningTasks.AsEnumerable())
{
task.Completed += Completed;
task.Cancelled += Cancelled;
this.enqueueTask(task);
}
manualResetEventSlim.Wait();
manualResetEventSlim.Reset();
}
private void LoadProgrammingParameters()
{
this.runningTasks.Clear();
var frequency = this.features.Frequency;
this.runningTasks.Enqueue(new EregisterCheckStateTask(frequency)
{
SlotNr = this.features.SlotNr,
PoNr = this.features.PoNr,
SerialNr = this.features.SerialNr,
P1 = new P811
{
DelPamSemi = true,
WakeUpCmd = true,
},
RequestAddress = this.features.RequestAddress,
ResponseAddress = this.features.ResponseAddress,
EncryptionKey = this.features.EncryptionKey
});
foreach (var pam in this.features.BuildPamsFull())
{
this.runningTasks.Enqueue(new EregisterTask(frequency)
{
SlotNr = this.features.SlotNr,
PoNr = this.features.PoNr,
SerialNr = this.features.SerialNr,
Name = pam.Key,
P1 = new P811
{
DelPamSemi = true,
},
RequestAddress = this.features.RequestAddress,
ResponseAddress = this.features.ResponseAddress,
Data = pam.Value,
EncryptionKey = this.features.EncryptionKey
});
}
}
}
}