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 bups; private readonly ConcurrentStack debugs; private readonly ConcurrentStack 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(); this.debugs = new ConcurrentStack(); this.semis = new ConcurrentStack(); } public event Action NewBUP; public event Action NewDEBUG; public event Action 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); } } }