diff --git a/Common/CommonConsole/CommonConsole.csproj b/Common/CommonConsole/CommonConsole.csproj
index 329466b8..b5506e4a 100644
--- a/Common/CommonConsole/CommonConsole.csproj
+++ b/Common/CommonConsole/CommonConsole.csproj
@@ -55,10 +55,6 @@
-
-
-
-
{8de8e742-ee0a-4004-aa49-3d08d748e5ac}
diff --git a/Common/CommonConsole/Program.cs b/Common/CommonConsole/Program.cs
index 5dd11781..90ebe9bb 100644
--- a/Common/CommonConsole/Program.cs
+++ b/Common/CommonConsole/Program.cs
@@ -2,37 +2,54 @@
{
using Common.Hardware.SIRT;
using Common.Hardware.SIRT.Tasks;
- using Common.Hardware.WaterMeter.eRegister.Telegrams;
+ using Common.Hardware.WaterMeter.eRegister;
+ using Common.Hardware.WaterMeter.eRegister.Features;
+
using System;
- using System.Threading;
public static class Program
{
public static void Main()
{
- var semi = new SEMI("08F3126B77C9000000320000740C000F0300000000000009140188BA30070E10A87F76D3FA000000000000000000000000000000000000000000000000000000000403003C0003012F9CBD671D000000000000000000000100011E95FD".GetBytes(), 868, new Common.Hardware.SIRT.Parameters.P11());
+ SIRTLogger.State += Console.WriteLine;
+ var sirtHub = new SIRTHub();
+ if (sirtHub.TryOpen("COM6", out var sirtId, out var frequency))
+ {
+ SIRTLogger.State -= Console.WriteLine;
+ SIRTLogger.Message += Console.WriteLine;
+ Console.WriteLine($"Listening on: COM6 - {frequency} - {sirtId}");
+
+ var task = new LEDTask(frequency, 319017453)
+ {
+ //WakeUpCmd = true,
+ //WakeUpModul = true,
+ //DelPamSemi = true,
+ Data = new byte[] { 0x1F, 0x01, 0x08, 0x43, 0x03, 0x63, 0x93, 0x73, 0x22 },
+ EncryptionKey = "E6C88800DEB868C0D6A84880CE982840".GetBytes(),
+ IsEncrypted = true,
+ };
- //var broadcaster = new SIRTBroadcaster("COM6");
- //broadcaster.Open();
+ sirtHub.Start(task);
+ task.Wait();
- //Console.WriteLine(broadcaster.Id);
- //Console.WriteLine();
-
- //while (Console.ReadKey().Key != ConsoleKey.Enter)
- //{
- // Console.WriteLine(broadcaster.AdddressesInPamPool());
-
- // Thread.Sleep(1000);
- //}
+ Console.ReadKey();
+ sirtHub.Close("COM6");
+ }
}
- public class ReadPamPoolTask : ReadPamTask
+ public class LEDTask : EregisterTask
{
- public override void Push(SIRTMessage response)
+ public LEDTask(int frequency, uint address) : base(frequency)
{
- Console.WriteLine(BitConverter.ToString(response));
+ this.RequestAddress = address;
+ }
+
+ public byte P811
+ {
+ get => this.p811;
+ set => this.p811 = value;
}
}
diff --git a/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj b/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj
index b70f99f2..6b942fe9 100644
--- a/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj
+++ b/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj
@@ -66,6 +66,7 @@
+
diff --git a/Common/Hardware/Common.Hardware.SIRT/SIRTBroadcaster.cs b/Common/Hardware/Common.Hardware.SIRT/SIRTBroadcaster.cs
index f0452f37..ad98a7ff 100644
--- a/Common/Hardware/Common.Hardware.SIRT/SIRTBroadcaster.cs
+++ b/Common/Hardware/Common.Hardware.SIRT/SIRTBroadcaster.cs
@@ -4,19 +4,19 @@
using System;
using System.Collections.Concurrent;
+ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
public class SIRTBroadcaster
{
- private readonly ConcurrentDictionary pampool;
private readonly ConcurrentDictionary tasks;
- // private readonly ConcurrentDictionary channels;
+ private readonly ConcurrentDictionary pampool;
private readonly SIRTStream sirtStream;
public string AdddressesInPamPool()
{
- return string.Join("\t", this.pampool.Keys);
+ return string.Join("\t", this.pampool.Values);
}
private CancellationTokenSource cancellationTokenSource;
@@ -27,9 +27,8 @@
public SIRTBroadcaster(string portName)
{
this.sirtStream = new SIRTStream(portName);
- this.pampool = new ConcurrentDictionary();
+ this.pampool = new ConcurrentDictionary();
this.tasks = new ConcurrentDictionary();
- // this.channels = new ConcurrentDictionary();
}
public event Action Connected;
@@ -44,19 +43,6 @@
public string PortName => this.sirtStream.PortName;
- public void ClearChannels(uint requestAddress, uint responseAddress)
- {
- //if (this.channels.TryRemove(requestAddress, out _))
- //{
- // SIRTLogger.LogState($"Cannel for {requestAddress} removed");
- //}
-
- //if (this.channels.TryRemove(responseAddress, out _))
- //{
- // SIRTLogger.LogState($"Cannel for {responseAddress} removed");
- //}
- }
-
public void Close()
{
this.sirtStream.Close();
@@ -73,7 +59,8 @@
}
}
- // Try(this.channels.Clear);
+ Try(this.tasks.Clear);
+ Try(this.pampool.Clear);
Try(this.cancellationTokenSource.Cancel);
var disconnectedEvent = this.Disconnected;
@@ -84,31 +71,6 @@
}
}
- public SIRTChannel GetOrCreateChannel(uint requestAddress, uint responseAddress)
- {
- //var requestChannel = this.channels.GetOrAdd(requestAddress, default(SIRTChannel));
- //var responseChannel = this.channels.GetOrAdd(responseAddress, default(SIRTChannel));
- //var channel = requestChannel ?? responseChannel ?? new SIRTChannel
- //{
- // RequestAddress = requestAddress,
- // ResponseAddress = responseAddress,
- // WriteHandler = this.Write
- //};
-
- //this.channels.AddOrUpdate(requestAddress, channel, (_1, _2) => channel);
- //this.channels.AddOrUpdate(responseAddress, channel, (_1, _2) => channel);
-
- SIRTLogger.LogState($"Cannel for {requestAddress} updated");
- SIRTLogger.LogState($"Cannel for {responseAddress} updated");
-
- return new SIRTChannel
- {
- RequestAddress = requestAddress,
- ResponseAddress = responseAddress,
- WriteHandler = this.Write
- };
- }
-
public void Open()
{
this.sirtStream.Open();
@@ -148,21 +110,35 @@
}
}
- public bool TryStart(SIRTTask task)
+ ///
+ /// Checks if the given task can be sent then replaces existing SIRTTask (if any) and starts the new one.
+ ///
+ public bool Start(SIRTTask task)
{
- var started = false;
+ var address = task.RequestAddress;
+ var addresses = this.pampool.Values.AsEnumerable();
+ var canStart = this.pampool.Count < 5 || addresses.Any(x => x == 0 || x == address);
+ SIRTLogger.LogMessage($"{this.PortName}|{this.pampool.Count} addresses in pam pool: {string.Join(", ", address)}");
+ SIRTLogger.LogMessage($"{this.PortName}|Can start task: {canStart}");
- this.tasks.GetOrAdd(task.RequestAddress, addr =>
+ if (canStart)
{
- task.StateChanged += TaskStateChanged;
- this.sirtStream.Write(task.Run());
+ var newTask = this.tasks.AddOrUpdate(
+ key: address,
+ addValueFactory: addr => task,
+ updateValueFactory: (addr, oldTask) =>
+ {
+ this.DeleteFromPamPool(oldTask);
- started = true;
+ return task;
+ });
- return task;
- });
+ var bytes = newTask.Start();
+ this.sirtStream.Write(bytes);
+ SIRTLogger.LogMessage($"{this.PortName}|RX: {BitConverter.ToString(bytes)}");
+ }
- return started;
+ return canStart;
}
public void Write(SIRTTask task)
@@ -171,7 +147,7 @@
{
task.Timestamp = DateTimeOffset.UtcNow;
task.SirtId = this.Id;
- var bytes = task.Run();
+ var bytes = task.Start();
this.sirtStream.Write(bytes);
SIRTLogger.LogMessage($"{this.PortName}|TX: {BitConverter.ToString(bytes)}");
@@ -193,7 +169,7 @@
{
Frequency = this.Frequency,
RequestAddress = task.RequestAddress,
- }.Run();
+ }.Start();
this.sirtStream.Write(deleteCmd);
waitEvent.Wait(300);
@@ -203,7 +179,7 @@
{
Frequency = this.Frequency,
RequestAddress = task.ResponseAddress,
- }.Run();
+ }.Start();
this.sirtStream.Write(deleteCmd);
waitEvent.Wait(300);
@@ -212,38 +188,27 @@
private void PampoolAsync()
{
- var task = new ReadPamTask
+ var task = new ReadPampoolTask();
+ var addresses = task.Addresses;
+ var addressesCount = addresses.Length;
+
+ this.pampool.Clear();
+
+ for (byte i = 0; i < addressesCount; i++)
{
- Frequency = this.Frequency,
- RequestAddress = 0xFFFFFFFF,
- Timeout = 3_000
- };
+ this.pampool.AddOrUpdate(i, addresses[i], (ix, addr) => addresses[i]);
+ }
while (this.IsOpen)
{
- if (this.TryStart(task))
+ this.Start(task);
+ task.Wait();
+
+ addresses = task.Addresses;
+
+ for (byte i = 0; i < addressesCount; i++)
{
- task.Wait();
-
- var payload = task.Payload;
- var address = default(uint);
-
- if (payload?.Length == 20)
- {
- this.pampool.Clear();
-
- for (var i = 0; i < 20; i += 4)
- {
- address = BitConverter.ToUInt32(payload, i);
-
- if (address == uint.MaxValue)
- {
- continue;
- }
-
- _ = this.pampool.GetOrAdd(address, true);
- }
- }
+ this.pampool.AddOrUpdate(i, addresses[i], (ix, addr) => addresses[i]);
}
}
}
@@ -278,21 +243,5 @@
SIRTLogger.LogState("Message receiving stopped");
}
-
- private void TaskStateChanged(SIRTTask task)
- {
- if (task.State == SIRTTaskState.Cancelled || task.State == SIRTTaskState.Completed)
- {
- this.tasks.TryRemove(task.RequestAddress, out _);
- this.tasks.TryRemove(task.ResponseAddress, out _);
-
- if (task.State == SIRTTaskState.Completed)
- {
- this.DeleteFromPamPool(task);
- }
-
- task.StateChanged -= this.TaskStateChanged;
- }
- }
}
}
diff --git a/Common/Hardware/Common.Hardware.SIRT/SIRTExtensions.cs b/Common/Hardware/Common.Hardware.SIRT/SIRTExtensions.cs
index 9e4f5c43..9525a3c1 100644
--- a/Common/Hardware/Common.Hardware.SIRT/SIRTExtensions.cs
+++ b/Common/Hardware/Common.Hardware.SIRT/SIRTExtensions.cs
@@ -637,7 +637,7 @@
for (var i = 0; i < 3 && task.State != SIRTTaskState.Completed; i++)
{
- _ = broadcaster.TryStart(task);
+ broadcaster.Start(task);
task.Wait();
done = task.State == SIRTTaskState.Completed;
@@ -653,7 +653,7 @@
for (var i = 0; i < 3 && task.State != SIRTTaskState.Completed; i++)
{
- _ = broadcaster.TryStart(task);
+ broadcaster.Start(task);
task.Wait();
done = task.State == SIRTTaskState.Completed;
diff --git a/Common/Hardware/Common.Hardware.SIRT/SIRTHub.cs b/Common/Hardware/Common.Hardware.SIRT/SIRTHub.cs
index 9b58e523..96199f3d 100644
--- a/Common/Hardware/Common.Hardware.SIRT/SIRTHub.cs
+++ b/Common/Hardware/Common.Hardware.SIRT/SIRTHub.cs
@@ -17,27 +17,8 @@
public event Action Disconnected;
public event Action