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 StateLogging; - public void Start(SIRTTask task) - { - foreach (var broadcaster in broadcasters.Values) - { - if (broadcaster.TryStart(task)) - { - break; - } - } - } - public event Action MessageProcessed; - public void ClearChannels(uint requestAddress, uint responseAddress) - { - foreach (var broadcaster in broadcasters.Values) - { - broadcaster.ClearChannels(requestAddress, responseAddress); - } - } - public void Close(string portName) { if (broadcasters.TryRemove(portName, out var sirtBroadcaster)) @@ -61,21 +42,21 @@ } } - public SIRTChannel GetOrCreateChannel(int frequency, uint requestAddress, uint responseAddress) + public bool Start(SIRTTask task) { - var channel = default(SIRTChannel); + var started = false; foreach (var broadcaster in broadcasters.Values) { - if (broadcaster.Frequency == frequency) + if (broadcaster.Start(task)) { - channel = broadcaster.GetOrCreateChannel(requestAddress, responseAddress); + started = true; break; } } - return channel; + return started; } public bool TryOpen(string portName, out string hexId, out int frequency) @@ -116,14 +97,6 @@ return sirtBroadcaster.IsOpen; } - public void Run(SIRTTask task) - { - foreach (var broadcaster in broadcasters.Values) - { - broadcaster.Write(task); - } - } - public void Stop() { try diff --git a/Common/Hardware/Common.Hardware.SIRT/SIRTStream.cs b/Common/Hardware/Common.Hardware.SIRT/SIRTStream.cs index b44e58c8..ccc4882e 100644 --- a/Common/Hardware/Common.Hardware.SIRT/SIRTStream.cs +++ b/Common/Hardware/Common.Hardware.SIRT/SIRTStream.cs @@ -99,7 +99,7 @@ } } } - + public void Write(params byte[] bytes) => this.sirtPort.Write(bytes); } } diff --git a/Common/Hardware/Common.Hardware.SIRT/Tasks/ReadPampoolTask.cs b/Common/Hardware/Common.Hardware.SIRT/Tasks/ReadPampoolTask.cs new file mode 100644 index 00000000..0dde678e --- /dev/null +++ b/Common/Hardware/Common.Hardware.SIRT/Tasks/ReadPampoolTask.cs @@ -0,0 +1,37 @@ +namespace Common.Hardware.SIRT.Tasks +{ + using System; + + public class ReadPampoolTask : ReadPamTask + { + public ReadPampoolTask() + { + this.Frequency = this.Frequency; + this.RequestAddress = 0xFFFFFFFF; + this.Addresses = new uint[5]; + this.Timeout = 3_000; + } + + public uint[] Addresses { get; } + + public override void Push(SIRTMessage response) + { + base.Push(response); + + if (this.Payload?.Length == 20) + { + Array.Clear(this.Addresses, 0, 5); + + for (var i = 0; i < 20; i++) + { + this.Addresses[i] = BitConverter.ToUInt32(this.Payload, i * 4); + + if (this.Addresses[i] == 0xFFFFFFFF) + { + this.Addresses[i]++; + } + } + } + } + } +} diff --git a/Common/Hardware/Common.Hardware.SIRT/Tasks/SIRTTask.cs b/Common/Hardware/Common.Hardware.SIRT/Tasks/SIRTTask.cs index 2d96f9da..9a05255b 100644 --- a/Common/Hardware/Common.Hardware.SIRT/Tasks/SIRTTask.cs +++ b/Common/Hardware/Common.Hardware.SIRT/Tasks/SIRTTask.cs @@ -82,7 +82,7 @@ this.awaiter.Reset(); } - public virtual byte[] Run() + public virtual byte[] Start() { this.awaiter.Reset(); diff --git a/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs b/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs index 1766660e..61c202c3 100644 --- a/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs +++ b/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs @@ -6,7 +6,7 @@ public class WritePamTask : SIRTTask { - private readonly P811 p811; + protected P811 p811; public WritePamTask() { diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs index 4e137350..4d2ae7dc 100644 --- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs +++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs @@ -17,7 +17,7 @@ { private readonly ConcurrentQueue runningTasks; private readonly EregisterProgrammingParameters parameters; - private readonly SIRTChannel sirtChannel; + private readonly SIRTHub sirtHub; private readonly EregisterHistory history; private readonly EregisterState state; @@ -27,10 +27,10 @@ public uint TempAdresse { get; set; } - public Eregister(EregisterProgrammingParameters parameters, SIRTChannel sirtChannel) + public Eregister(EregisterProgrammingParameters parameters, SIRTHub sirtHub) { this.parameters = parameters; - this.sirtChannel = sirtChannel; + this.sirtHub = sirtHub; this.state = new EregisterState(); this.history = new EregisterHistory(); this.runningTasks = new ConcurrentQueue(); @@ -102,46 +102,27 @@ this.history.TempAdresse = this.parameters.TempAdresse; var stopProgramming = false; - var readEvent = new ManualResetEventSlim(); var task = default(EregisterTask); var firstTask = true; - void messageReceived(SIRTMessage message) - { - this.history.Push(message); - - if (task != null) - { - task.Push(message); - - if (task.State == SIRTTaskState.Completed || task.State == SIRTTaskState.Cancelled) - { - readEvent.Set(); - } - } - } - - this.sirtChannel.MessageReceived += messageReceived; - while (this.runningTasks.TryPeek(out task) && task.State != SIRTTaskState.Cancelled && !cancellationToken.IsCancellationRequested) { while (task.State != SIRTTaskState.Completed && task.State != SIRTTaskState.Cancelled && !cancellationToken.IsCancellationRequested) { - this.sirtChannel.WriteHandler(task); + this.sirtHub.Start(task); this.history.Push(task); - readEvent.Wait(task.Timeout); - readEvent.Reset(); + task.Wait(); - if (firstTask && !task.AnyTelegramReceived) - { - _ = MessageBox.Show($"Das Rechenwerk an Ep: {task.SlotNr} mit Funkadresse: {task.RequestAddress}|{task.ResponseAddress} sendet nicht. " - + $"Überprüfen Sie, ob alle SIRT's sind und oder die Funkfrequenz von dem Rechenwerk ist nicht verwechselt." - , "Achtung" - , MessageBoxButtons.OK); - stopProgramming = true; + //if (firstTask && !task.AnyTelegramReceived) + //{ + // _ = MessageBox.Show($"Das Rechenwerk an Ep: {task.SlotNr} mit Funkadresse: {task.RequestAddress}|{task.ResponseAddress} sendet nicht. " + // + $"Überprüfen Sie, ob alle SIRT's sind und oder die Funkfrequenz von dem Rechenwerk ist nicht verwechselt." + // , "Achtung" + // , MessageBoxButtons.OK); + // stopProgramming = true; - break; - } + // break; + //} if (task.ErrorMessage != null) { @@ -156,8 +137,6 @@ break; } } - - this.RemoveFromPamPoolIfNotCompleted(readEvent, task); } firstTask = false; @@ -193,8 +172,6 @@ this.UpdateTasksStateInTheQueue(task); } - this.sirtChannel.MessageReceived -= messageReceived; - if (stopProgramming) { return; @@ -216,23 +193,6 @@ } } - private void RemoveFromPamPoolIfNotCompleted(ManualResetEventSlim readEvent, EregisterTask task) - { - if (task.State != SIRTTaskState.Completed) - { - var deleteFromPamPoolTask = new DeleteFromPamPoolTask - { - Frequency = task.Frequency, - RequestAddress = task.RequestAddress, - ResponseAddress = task.ResponseAddress, - }; - - this.sirtChannel.WriteHandler(deleteFromPamPoolTask); - readEvent.Wait(500); - readEvent.Reset(); - } - } - private void UpdateTasksStateInTheQueue(EregisterTask task) { var cultureInfo = CultureInfo.InvariantCulture; @@ -277,8 +237,9 @@ SlotNr = features.SlotNr, PoNr = features.PoNr, SerialNr = features.SerialNr, - WakeUpCmd = true, DelPamTx = true, + WakeUpCmd = true, + WakeUpModul = true, RequestAddress = features.RequestAddress, ResponseAddress = features.ResponseAddress, EncryptionKey = features.EncryptionKey, diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs index 11ba49a8..965f3e8a 100644 --- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs +++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs @@ -24,8 +24,7 @@ foreach (var parameters in parametersList) { - var channel = this.sirtHub.GetOrCreateChannel(parameters.Frequency, (uint)parameters.TempAdresse, (uint)parameters.Adresse); - var eregister = new Eregister(parameters, channel); + var eregister = new Eregister(parameters, this.sirtHub); this.eregisters.Add(eregister); @@ -39,8 +38,7 @@ foreach (var parameters in parametersList) { - var channel = this.sirtHub.GetOrCreateChannel(parameters.Frequency, (uint)parameters.TempAdresse, (uint)parameters.Adresse); - var eregister = new Eregister(parameters, channel); + var eregister = new Eregister(parameters, this.sirtHub); this.eregisters.Add(eregister); @@ -77,8 +75,6 @@ { foreach (var eregister in this.eregisters) { - this.sirtHub.ClearChannels(eregister.TempAdresse, eregister.Adresse); - eregister.Clear(); } diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterChangeMeterTypeTask.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterChangeMeterTypeTask.cs index da809a70..18f38034 100644 --- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterChangeMeterTypeTask.cs +++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterChangeMeterTypeTask.cs @@ -9,7 +9,7 @@ public EregisterChangeMeterTypeTask(int frequency) : base(frequency) => this.Name = "Change meter type"; - public override byte[] Run() + public override byte[] Start() { var numberStyles = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier; var cultureInfo = CultureInfo.InvariantCulture; @@ -29,7 +29,7 @@ .Append(new ProvidePin { AuthLevel = AuthLevel.III }) .ToByteArray(); - return base.Run(); + return base.Start(); } } } diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs index d9905c80..9071f1c9 100644 --- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs +++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs @@ -64,13 +64,13 @@ public ErrorMessage ErrorMessage { get; protected set; } - public override byte[] Run() + public override byte[] Start() { var payloadL = this.request.Payload.Length; this.payload = new byte[payloadL]; Array.Copy(this.request.Payload, 0, this.payload, 0, payloadL); - + if (this.FactoryState == FactoryState.Shipment) { this.payload = new EregisterAvailableParametersParser(this.payload); diff --git a/Common/Ui/Common.UI/App.xaml.cs b/Common/Ui/Common.UI/App.xaml.cs index 501a2763..71c8705f 100644 --- a/Common/Ui/Common.UI/App.xaml.cs +++ b/Common/Ui/Common.UI/App.xaml.cs @@ -1,9 +1,6 @@ namespace Common.UI { using Common.UI.Infrastructure; - using Common.UI.Pages.Eregister.M.Data; - - using SQLite; using System; using System.Diagnostics; diff --git a/Common/Ui/Common.UI/Infrastructure/AppHost.cs b/Common/Ui/Common.UI/Infrastructure/AppHost.cs index 2d32a317..c97e9420 100644 --- a/Common/Ui/Common.UI/Infrastructure/AppHost.cs +++ b/Common/Ui/Common.UI/Infrastructure/AppHost.cs @@ -17,6 +17,58 @@ public static string GetSetting(string key) => Appsettings.GetSetting(key); + private static ILogger CreateSIRTMessageLogger() + { + var dll = new FileInfo(typeof(AppHost).Assembly.Location); + var name = "SIRTMessages"; + var nlogs = dll.Directory.CreateSubdirectory(name); + var file = Path.Combine(nlogs.FullName, $"{DateTime.Now:yyyy-MM-dd}.txt"); + + LogManager.Configuration = new LoggingConfiguration(); + LogManager.ThrowConfigExceptions = true; + LogManager.ThrowExceptions = true; + LogManager.AutoShutdown = true; + + LogManager.Configuration.AddTarget(new FileTarget(name) + { + CreateDirs = true, + KeepFileOpen = true, + FileName = file + }); + + LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Fatal, name); + LogManager.LogFactory.ReconfigExistingLoggers(true); + LogManager.ReconfigExistingLoggers(true); + + return LogManager.GetLogger(name); + } + + private static ILogger CreateSIRTStateLogger() + { + var dll = new FileInfo(typeof(AppHost).Assembly.Location); + var name = "SIRTState"; + var nlogs = dll.Directory.CreateSubdirectory(name); + var file = Path.Combine(nlogs.FullName, $"{DateTime.Now:yyyy-MM-dd}.txt"); + + LogManager.Configuration = new LoggingConfiguration(); + LogManager.ThrowConfigExceptions = true; + LogManager.ThrowExceptions = true; + LogManager.AutoShutdown = true; + + LogManager.Configuration.AddTarget(new FileTarget(name) + { + CreateDirs = true, + KeepFileOpen = true, + FileName = file + }); + + LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Fatal, name); + LogManager.LogFactory.ReconfigExistingLoggers(true); + LogManager.ReconfigExistingLoggers(true); + + return LogManager.GetLogger(name); + } + private static ILogger CreateSIRTLogger() { var dll = new FileInfo(typeof(AppHost).Assembly.Location); @@ -46,7 +98,7 @@ private static SIRTHub CreateSIRTFactory() { var sirtHub = new SIRTHub(); - + SIRTLogger.Message += NLogger.Debug; return sirtHub; diff --git a/Common/Ui/Common.UI/Infrastructure/Appsettings.cs b/Common/Ui/Common.UI/Infrastructure/Appsettings.cs index a6a8d850..fac217f1 100644 --- a/Common/Ui/Common.UI/Infrastructure/Appsettings.cs +++ b/Common/Ui/Common.UI/Infrastructure/Appsettings.cs @@ -2,6 +2,7 @@ { using System; using System.Configuration; + using System.Linq; public static class Appsettings { @@ -26,5 +27,11 @@ return settingValue; } + + public static string[] GetSIRTComPorts() + => GetSetting("SIRTComPorts") + ?.Split(new[] { ';', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries) + ?.Select(x => x?.Trim()) + ?.ToArray() ?? new string[0]; } } diff --git a/Common/Ui/Common.UI/Infrastructure/VMLocator.cs b/Common/Ui/Common.UI/Infrastructure/VMLocator.cs index 3e367e4d..2afb9774 100644 --- a/Common/Ui/Common.UI/Infrastructure/VMLocator.cs +++ b/Common/Ui/Common.UI/Infrastructure/VMLocator.cs @@ -11,5 +11,7 @@ public EregisterInitializeVM EregisterInitializeVM { get; } = new EregisterInitializeVM(); public EregisterFinalizeVM EregisterFinalizeVM { get; } = new EregisterFinalizeVM(); + + public ManualProgrammingVM ManualProgrammingVM { get; } = new ManualProgrammingVM(); } } diff --git a/Common/Ui/Common.UI/Pages/ManualProgramming.xaml b/Common/Ui/Common.UI/Pages/ManualProgramming.xaml index 51b36ebe..822d4c89 100644 --- a/Common/Ui/Common.UI/Pages/ManualProgramming.xaml +++ b/Common/Ui/Common.UI/Pages/ManualProgramming.xaml @@ -1,7 +1,44 @@  + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + DataContext="{Binding ManualProgrammingVM, Source={StaticResource VMLocator}}" + FontFamily="Consolas" + FontSize="13"> - + + + + + + + + + +