176 lines
6.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|