namespace CommonConsole { using Common.Hardware.SIRT; using Common.Hardware.SIRT.Parameters; using Common.Hardware.SIRT.Tasks; using Common.Hardware.WaterMeter.eRegister; using Common.Hardware.WaterMeter.eRegister.Features; using System; using System.IO.Ports; using System.Linq; using System.Text.RegularExpressions; using System.Threading; public class PAM03 { private string portName; private uint address; private byte[] key; public int Run(params string[] args) { /// /// Process.ExitCode: /// 0 - OK /// 1 - Execution Error /// 2 - Connection Error /// 3 - Invalid Arguments /// var exitCode = this.ParseArguments(args); if (exitCode == 0) { var processAwaiter = new ManualResetEventSlim(); var sirtBroadcaster = new SIRTBroadcaster(this.portName); var pinI = new ProvidePin { AuthLevel = AuthLevel.I }; void SIRTBroadcaster_Connected(SIRTBroadcaster sirt) { var task = new CordonelTask(sirt.Frequency) { DelPamSemi = true, WakeUpCmd = true, WakeUpModul = true, RequestAddress = address, EncryptionKey = key, IsEncrypted = true }; task.SetPending(); sirt.Start(task); task.Wait(); void ResetAlarms(byte alarmMask) { if (exitCode != 0) { return; } task.WakeUpCmd = false; task.WakeUpModul = false; task.Data = new ResetAlarms(alarmMask).Append(pinI); task.SetPending(); sirt.Start(task); task.Wait(); if (task.State != SIRTTaskState.Completed) { Console.WriteLine($"{nameof(SIRTTaskState)}.{task.State}"); exitCode = 1; } exitCode = 0; } task.SetPending(); sirt.Start(task); task.Wait(); if (task.State != SIRTTaskState.Completed) { exitCode = 1; } ResetAlarms(new AlarmsMask(0xFF) { MediumAbsent = false }); ResetAlarms(0xFE); processAwaiter.Set(); } void SIRTBroadcaster_Disconnected(SIRTBroadcaster _) => processAwaiter.Set(); sirtBroadcaster.Connected += SIRTBroadcaster_Connected; sirtBroadcaster.Disconnected += SIRTBroadcaster_Disconnected; sirtBroadcaster.Open(); processAwaiter.Wait(); sirtBroadcaster.Close(); sirtBroadcaster.Disconnected -= SIRTBroadcaster_Disconnected; sirtBroadcaster.Connected -= SIRTBroadcaster_Connected; } return exitCode; } public int ParseArguments(string[] args) { if (args.Length != 3) { Console.WriteLine($"Falsche anzahl an parameter: '{string.Join("', '", args)}'"); Console.WriteLine($"Expected: [COM..n as string] [Address as uint] [EncryptionKey as string]"); return 3; } this.portName = args[0]; if (Regex.IsMatch($"{this.portName}", "[Cc][Oo][Mm][0-9]+")) { this.portName = this.portName.ToUpper(); } else if (SerialPort.GetPortNames().Any(x => x.Equals(this.portName, StringComparison.CurrentCultureIgnoreCase))) { Console.WriteLine($"COM Port: '{this.portName}' - nicht vorhanden"); return 3; } else { Console.WriteLine($"Falsche COM PortName: '{this.portName}' - erwartet: [Cc][Oo][Mm][0-9]+"); return 3; } if (!uint.TryParse($"{args[1]}", out this.address)) { Console.WriteLine($"Ungültige Funkadresse: '{args[1]}'"); return 3; } this.key = $"{args[2]}".GetBytes(); if (this.key.Length != 16) { Console.WriteLine($"Ungültige Funkschlüssel: '{BitConverter.ToString(this.key)}'"); return 3; } return 0; } public class CordonelTask : EregisterTask { public CordonelTask(int frequency) : base(frequency) { } public override Byte[] Start() { Console.WriteLine($"TX|{BitConverter.ToString(this.request)}"); return base.Start(); } public override void Receive(SIRTMessage response) { base.Receive(response); Console.WriteLine($"RX|{BitConverter.ToString(response)}"); try { if (this.SEMIMessage != null) { Console.WriteLine($"========================================="); Console.WriteLine($"AlarmsMask"); Console.WriteLine($"-----------------------------------------"); Console.WriteLine($"{new AlarmsMask(response.Payload[10])}"); Console.WriteLine($"========================================="); Console.WriteLine($"RSSI.PAM {response.P2}"); Console.WriteLine($"RSSI.SEMI {response.Payload[12]}"); Console.WriteLine($"PAMStatus {new PAMStatus(response.Payload[11])}"); Console.WriteLine($"========================================="); } } catch (Exception e) { Console.WriteLine(e.Message); } } } } }