202 lines
6.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|