laatzen/Common/CommonConsole/PAM03.cs

202 lines
6.5 KiB
C#

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)
{
/// <summary>
/// Process.ExitCode:
/// 0 - OK
/// 1 - Execution Error
/// 2 - Connection Error
/// 3 - Invalid Arguments
/// </summary>
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,
EncryptionKeyI = 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);
}
}
}
}
}