Files
laatzen/Common/SIRTBroadcaster.Client/Messages/Payload.cs
T
2023-08-22 14:58:05 +02:00

176 lines
6.1 KiB
C#

namespace SIRTBroadcaster.Client
{
using SIRTBroadcaster.Abstraction;
using SIRTBroadcaster.Client.Messages.FromAir;
using System;
using System.Collections.Concurrent;
using System.Text;
public partial class Payload
{
private readonly ConcurrentStack<BUP> bups;
private readonly ConcurrentStack<DEBUG> debugs;
private readonly ConcurrentStack<SEMI> semis;
private readonly string sirtId;
private readonly uint address;
public Payload(string sirtId, uint address)
{
this.sirtId = sirtId;
this.address = address;
this.bups = new ConcurrentStack<BUP>();
this.debugs = new ConcurrentStack<DEBUG>();
this.semis = new ConcurrentStack<SEMI>();
}
public event Action<BUP> NewBUP;
public event Action<DEBUG> NewDEBUG;
public event Action<SEMI> NewSEMI;
public BUP LastBUP => this.bups.TryPeek(out var bup) ? bup : new BUP();
public DEBUG LastDEBUG => this.debugs.TryPeek(out var debug) ? debug : new DEBUG();
public SEMI LastSEMI => this.semis.TryPeek(out var semi) ? semi : new SEMI();
internal void AddBUP(SIRTMessage message)
{
var data = message.Data;
var bup = new BUP
{
AppCode = data[0],
Counter = data[1],
Address = data.ToUInt32(2),
BillingVolume = data.ToUInt32(6),
Alarm = data[10],
CRC = data.ToUInt16(11),
};
this.bups.Push(bup);
this.NewBUP?.Invoke(bup);
}
internal void AddDEBUG(SIRTMessage message)
{
var data = message.Data;
var debug = new DEBUG
{
Length = data[0],
AppCode = data[1],
Counter = data[2],
Address = data.ToUInt32(3),
DebugType = data[7],
MeterType = data[8],
VersionRadioFW = data[9],
VersionFW = data[10],
RevisionFW = data.ToUInt16(11),
VersionHW = data[13],
FactoryState = data[14],
PcbId = data.ToUInt32(15),
Temperatur = data[19],
BatteryV = data.ToUInt16(20),
WakeUpInterval = data[22],
TXPowerRF = data[23],
TXPowerFlex = data[24],
OffsetRF = data.ToUInt16(25),
RebootCount = data[27],
WatchdogCount = data[28],
BatterySeconds = data.ToUInt32(29),
MeterSampleRate = data[33],
HistoryScale = data[34],
RegisterMode = data[35],
HistorySize = data[36],
FactoryCalibration = data[37],
MeterSize = data[38],
VolumeLED = data.ToUInt32(39),
Volume = data.ToUInt32(43),
OffsetFactor = data.ToUInt32(47),
OffsetTime = data[51]
};
if (data.Length == 53)
{
debug.CRC = data.ToUInt16(52);
}
this.debugs.Push(debug);
this.NewDEBUG?.Invoke(debug);
}
internal void AddSEMI(SIRTMessage message)
{
var data = message.Data;
var semi = new SEMI
{
Length = data[0],
AppCode = data[1],
Counter = data[2],
Address = data.ToUInt32(3),
BillingVolume = data.ToUInt32(7),
Alarm = data[11],
PamStatus = data[12],
PamRSSI = data[13],
MeterType = data[14],
TransmissionInterval = data.ToUInt16(15),
LatInterval = data[17],
CurrentFlow = data.ToUInt16(18),
BackwardVolume = data.ToUInt32(20),
NumberOfDials = data[24],
VolumUnit = data[25],
MeterId = data.ToUInt32(26),
OMStatus = data[30],
OMTransmissionInterval = data.ToUInt16(31),
AlarmMaskActiveInfo = data[33],
LeakageDetectionParams = data[34],
BrokenPipeDetectionParams = data[35],
BatteryRemaining = data.ToUInt16(36),
BatteryEndDetected = data.ToUInt16(38),
MaxFlow = data.ToUInt16(40),
MaxFlowTime = data.ToUInt16(42),
LowBatteryDetected = data.ToUInt16(44),
LeakStart = data.ToUInt16(46),
LeakEnd = data.ToUInt16(48),
MagneticTamperStart = data.ToUInt16(50),
MagneticTamperEnd = data.ToUInt16(52),
ModuleRemoveStart = data.ToUInt16(54),
ModuleRemoveEnd = data.ToUInt16(56),
BackflowStart = data.ToUInt16(58),
BackflowEnd = data.ToUInt16(60),
BrokenPipeStart = data.ToUInt16(62),
BrokenPipeEnd = data.ToUInt16(64),
LogContent = data.ToUInt16(66),
LoggingInterval = data.ToUInt16(68),
FixedDateReadingContent = data.ToUInt16(70),
BillingDay = data[72],
ActualDateTime = data.ToUInt32(73),
HistoryErrorLimitInDays = data[77],
CustomerText = Encoding.UTF8.GetString(new byte[]
{
data[78],
data[79],
data[80],
data[81],
data[82],
data[83],
data[84],
data[85],
data[86],
}),
TimeOfFDRReset = data.ToUInt16(87),
TimeOfLogReset = data.ToUInt16(89),
MeterSize = data[91],
};
if (data.Length == 93)
{
semi.CRC = data.ToUInt16(92);
}
this.semis.Push(semi);
this.NewSEMI?.Invoke(semi);
}
}
}