public static void EventsHandler(BaseEvent evt, Logger l)
        {
            if (evt is BlowingEvent) {
                var be = evt as BlowingEvent;
                Keeper.SetBlowingStatus(be.BlowingFlag == 1);
            } else

            if (evt is FlexEvent) {
                var fxe = evt as FlexEvent;
                if (fxe.Operation.StartsWith("UDP.OffGasAnalysisEvent")) {
                    var fxh = new FlexHelper(fxe);

                    var co = fxh.GetDbl("CO");
                    var co2 = fxh.GetDbl("CO2");

                    SetGasAnalysis(co, co2);
                } else

                if (fxe.Operation.StartsWith("OPC.WatchdogsFromL1"))
                {
                    var fxh = new FlexHelper(fxe);
                    var wd1 = fxh.GetInt("WDPLC1");
                    var wd2 = fxh.GetInt("WDPLC2");
                    var wd3 = fxh.GetInt("WDPLC3");
                    var wd01 = fxh.GetInt("WDPLC01");

                    SetWatchdogReceive(wd1, wd2, wd3, wd01);
                }
            }
        }
        public void OnEvent(BaseEvent evt)
        {
            using (var l = new Logger("Listener")) {
                if (evt is LanceEvent) {
                    var le = evt as LanceEvent;
                    Iterator.Receiver.LanceHeight = le.LanceHeight;
                    Iterator.Receiver.QO2 = le.O2Flow;
                    Iterator.Receiver.QO2I = le.O2TotalVol;
                }
                if (evt is BlowingEvent) {
                    var be = evt as BlowingEvent;
                    Iterator.Receiver.HeatIsStarted = be.BlowingFlag == 1;
                }

                if (evt is OffGasEvent) {
                    var oge = evt as OffGasEvent;
                    Iterator.Receiver.OffGasV.Add(oge.OffGasFlow);
                    Iterator.Receiver.OffGasT.Add(oge.OffGasTemp);
                }
                if (evt is DecompressionOffGasEvent) {
                    var doge = evt as DecompressionOffGasEvent;
                    Iterator.Receiver.OffGasDecompression.Add(doge.Decompression);
                }
                if (evt is HeatChangeEvent) {
                    var hce = evt as HeatChangeEvent;
                    if (CHeatNumber != hce.HeatNumber) {
                        CHeatNumber = hce.HeatNumber;
                        Iterator.Reset();
                        Iterator.CurrentState.HeatNumber = hce.HeatNumber;
                        Iterator.ArchFileGen();
                        l.msg("Heat Changed. New Heat ID: {0}\n", Iterator.CurrentState.HeatNumber);
                    }
                    else
                        l.msg("Heat No Changed. Heat ID: {0}\n", hce.HeatNumber);
                }

                if (evt is SublanceStartEvent) {
                    var sse = evt as SublanceStartEvent;
                    if (sse.SublanceStartFlag == 1) {}
                    if (sse.SublanceStartFlag == 0) {
                        //
                    }
                }

                if (evt is visSpectrluksEvent) // углерод со спектролюкса
                {
                    var vse = evt as visSpectrluksEvent;
                    //Iterator.FindAndDequeue(vse.C, HeatNumberToShort(vse.HeatNumber));
                }

                if (evt is ScrapEvent) {
                    var se = evt as ScrapEvent;
                    if (se.ConverterNumber == Program.ConverterNumber) {
                        Iterator.CurrentState.MSc = se.TotalWeight;
                        l.msg("Scrap mass: {0}", Iterator.CurrentState.MSc);
                    }
                }
                if (evt is BoundNameMaterialsEvent) {
                    var bnme = evt as BoundNameMaterialsEvent;
                    BoundMaterials = new List<string>();
                    BoundMaterials.Add(bnme.Bunker5MaterialName);
                    BoundMaterials.Add(bnme.Bunker6MaterialName);
                    BoundMaterials.Add(bnme.Bunker7MaterialName);
                    BoundMaterials.Add(bnme.Bunker8MaterialName);
                    BoundMaterials.Add(bnme.Bunker9MaterialName);
                    BoundMaterials.Add(bnme.Bunker10MaterialName);
                    BoundMaterials.Add(bnme.Bunker11MaterialName);
                    BoundMaterials.Add(bnme.Bunker12MaterialName);
                }

                if (evt is visAdditionTotalEvent) {
                    var vate = evt as visAdditionTotalEvent;
                    WeightMaterials = new List<double>();
                    WeightMaterials.Add(vate.RB5TotalWeight);
                    WeightMaterials.Add(vate.RB6TotalWeight);
                    WeightMaterials.Add(vate.RB7TotalWeight);
                    WeightMaterials.Add(vate.RB8TotalWeight);
                    WeightMaterials.Add(vate.RB9TotalWeight);
                    WeightMaterials.Add(vate.RB10TotalWeight);
                    WeightMaterials.Add(vate.RB11TotalWeight);
                    WeightMaterials.Add(vate.RB12TotalWeight);

                    //BoundMaterials = new List<string>(); // на время отладки на эмуляторе
                    //BoundMaterials.Add("ДОЛОМС");
                    //BoundMaterials.Add("ALKонц");
                    //BoundMaterials.Add("KOKS  ");
                    //BoundMaterials.Add("ИЗВЕСТ");
                    //BoundMaterials.Add("ИЗВЕСТ");
                    //BoundMaterials.Add("ДОЛМИТ");
                    //BoundMaterials.Add("ДОЛОМС");
                    //BoundMaterials.Add("ФОМ   ");

                    var bunkerCnt = BoundMaterials.Count;
                    for (int i = 0; i < bunkerCnt; i++) {
                        var wgh = WeightMaterials[i];
                        var name = BoundMaterials[i];
                        for (int j = 0; j < bunkerCnt; j++) {
                            if ((i != j) && (name == BoundMaterials[j]))
                                wgh += WeightMaterials[j];
                        }

                        if (!Iterator.Receiver.HeatIsStarted) // все что отдали до продувки не считаем
                        {
                            Iterator.MaterialsZeroLevel.SetTotalWeight(Encoder(name), wgh, false);

                            //Iterator.MaterialsZeroLevel.SetTotalWeight(name, wgh, false); // временно для отладки
                        }
                        else
                        {
                            var wghZlevel = Iterator.MaterialsZeroLevel.GetTotalWeight(Encoder(name), false);
                            Iterator.CurrentState.Materials.SetTotalWeight(Encoder(name), wgh - wghZlevel, false);

                            //var wghZlevel = Iterator.MaterialsZeroLevel.GetTotalWeight(name, false); // временно для отладки
                            //Iterator.CurrentState.Materials.SetTotalWeight(name, wghZlevel - wgh, false); // временно для отладки
                        }

                        //Iterator.CurrentState.Materials.SetTotalWeight(Encoder(name), wgh, false);
                        //Iterator.CurrentState.Materials.SetTotalWeight(name, wgh, false); // временно для отладки
                    }
                }

                if (evt is FlexEvent) {
                    var fxe = evt as FlexEvent;
                    if (fxe.Operation.StartsWith("UDP.OffGasAnalysisEvent")) {
                        var fxh = new FlexHelper(fxe);

                        Iterator.Receiver.H2.Add(fxh.GetDbl("H2"));
                        Iterator.Receiver.O2.Add(fxh.GetDbl("O2"));
                        Iterator.Receiver.CO.Add(fxh.GetDbl("CO"));
                        Iterator.Receiver.CO2.Add(fxh.GetDbl("CO2"));
                        Iterator.Receiver.N2.Add(fxh.GetDbl("N2"));
                        Iterator.Receiver.Ar.Add(fxh.GetDbl("Ar"));

                        if (fxh.GetDbl("Branch") == 1)
                            Iterator.CurrentState.OffGasTransportDelay = (int) Math.Round(fxh.GetDbl("TransportDelay1"));
                        else if (fxh.GetDbl("Branch") == 2)
                            Iterator.CurrentState.OffGasTransportDelay = (int) Math.Round(fxh.GetDbl("TransportDelay2"));
                    }

                    if (fxe.Operation.StartsWith("PipeCatcher.Call.PCK_DATA.PGET_WGHIRON1")) {
                        if ((string) fxe.Arguments["SHEATNO"] ==
                            Convert.ToString(HeatNumberToLong(Iterator.CurrentState.HeatNumber))) {
                            l.msg("Iron Correction from Pipe: {0}\n", fxe.Arguments["NWGH_NETTO"]);
                            var hotIronMass = Convert.ToDouble(fxe.Arguments["NWGH_NETTO"])*1000;
                            Iterator.CurrentState.MHi = hotIronMass;
                        }
                        else {
                            l.msg(
                                "Iron Correction from Pipe: wrong heat number - expected {0} found {1}",
                                Iterator.CurrentState.HeatNumber, fxe.Arguments["SHEATNO"]
                                );
                        }
                    }

                    if (fxe.Operation.StartsWith("PipeCatcher.Call.PCK_DATA.PGET_XIMIRON")) {
                        if ((string) fxe.Arguments["HEAT_NO"] ==
                            Convert.ToString(HeatNumberToLong(Iterator.CurrentState.HeatNumber))) {
                            l.msg(fxe.ToString());
                            var hotIronMass = Convert.ToDouble(fxe.Arguments["HM_WEIGHT"]);
                            var hotIronCarbon = Convert.ToDouble(fxe.Arguments["ANA_C"]);
                            Iterator.CurrentState.MHi = hotIronMass;
                            Iterator.CurrentState.PCHi = hotIronCarbon;
                        }
                        else {
                            l.msg(
                                "Iron Correction from Pipe: wrong heat number - expected {0} found {1}",
                                HeatNumberToLong(Iterator.CurrentState.HeatNumber), fxe.Arguments["HEAT_NO"]
                                );
                        }
                    }
                }
            }
        }
        public void OnEvent(BaseEvent newEvent)
        {
            using (var l = new Logger("FlexEventSaver")) {
                if (newEvent is LanceEvent) {
                    var lanceEvent = newEvent as LanceEvent;
                    Program.SDS.LanceHeigth.Add(lanceEvent.LanceHeight);
                    Program.SDS.OxygenRate.Add(lanceEvent.O2Flow);
                    Program.OxygenRate.Add(lanceEvent.O2Flow);
                }
                //if (newEvent is OffGasAnalysisEvent)
                //{
                //    var offGasAnalysisEvent = newEvent as OffGasAnalysisEvent;
                //    Program.SDS.H2Perc.Add(offGasAnalysisEvent.H2);
                //    Program.SDS.O2Perc.Add(offGasAnalysisEvent.O2);
                //    Program.SDS.COPerc.Add(offGasAnalysisEvent.CO);
                //    Program.SDS.CO2Perc.Add(offGasAnalysisEvent.CO2);
                //    Program.SDS.N2Perc.Add(offGasAnalysisEvent.N2);
                //    Program.SDS.ArPerc.Add(offGasAnalysisEvent.Ar);
                //}
                if (newEvent is OffGasEvent) {
                    var offGasEvent = newEvent as OffGasEvent;
                    Program.SDS.VGas.Add(offGasEvent.OffGasFlow);
                    Program.SDS.TGas.Add(offGasEvent.OffGasTemp);
                }
                if (newEvent is CalculatedCarboneEvent) {
                    var cCarbon = newEvent as CalculatedCarboneEvent;
                    //Program.SDS.CCalc.Add(cCarbon.CarbonePercent);
                }
                if (newEvent is SublanceCEvent) {
                    var sublanceCEvent = newEvent as SublanceCEvent;
                    Program.SDS.CSubLance = sublanceCEvent.C;
                }
                if (newEvent is IgnitionEvent) {
                    var ign = newEvent as IgnitionEvent;
                    Program.SDS.Ignition = ign.FusionIgnition;
                }
                if (newEvent is DecompressionOffGasEvent) {
                    var doge = newEvent as DecompressionOffGasEvent;
                    Program.SDS.Decompression.Add(doge.Decompression);
                }
                if (newEvent is O2Event) {
                    var o2e = newEvent as O2Event;
                    if (o2e.RightLanceIsSelected && !o2e.LeftLanceIsSelected) {
                        Program.SDS.QOxygenCL.Add(o2e.QOxygenRight);
                        Program.SDS.POxygenCL.Add(o2e.POxygenRight);
                        Program.SDS.TOxygenCL.Add(o2e.TOxygenRight);
                        Program.SDS.DPOxygenCL.Add(o2e.DPOxygenRight);
                    }
                    else {
                        Program.SDS.QOxygenCL.Add(o2e.QOxygenLeft);
                        Program.SDS.POxygenCL.Add(o2e.POxygenLeft);
                        Program.SDS.TOxygenCL.Add(o2e.TOxygenLeft);
                        Program.SDS.DPOxygenCL.Add(o2e.DPOxygenLeft);
                    }
                }
                if (newEvent is N2Event) {
                    var n2e = newEvent as N2Event;
                    Program.SDS.QNitrogenLanceWindow.Add(n2e.QNitrogenLanceWindow);
                    Program.SDS.QNitrogenBoiler.Add(n2e.QNitrogenBoiler);
                }
                if (newEvent is visAdditionTotalEvent) {
                    var vate = newEvent as visAdditionTotalEvent;
                    Program.SDS.RB5 = vate.RB5TotalWeight;
                    Program.SDS.RB6 = vate.RB6TotalWeight;
                    Program.SDS.RB7 = vate.RB7TotalWeight;
                    Program.SDS.RB8 = vate.RB8TotalWeight;
                    Program.SDS.RB9 = vate.RB9TotalWeight;
                    Program.SDS.RB10 = vate.RB10TotalWeight;
                    Program.SDS.RB11 = vate.RB11TotalWeight;
                    Program.SDS.RB12 = vate.RB12TotalWeight;
                }
                if (newEvent is HeatChangeEvent) {
                    var heatChangeEvent = newEvent as HeatChangeEvent;
                    if (m_lasIdHeat != heatChangeEvent.HeatNumber) {
                        Program.SaverData(Program.SDList, m_lasIdHeat);
                        m_lasIdHeat = heatChangeEvent.HeatNumber;
                        Program.Init();
                    }
                }
                if (newEvent is FlexEvent) {
                    var fxe = newEvent as FlexEvent;
                    if (fxe.Operation.StartsWith("NeuralProcessorC.Calc")) {
                        var key = "C";
                        //l.msg(fxe.ToString());
                        if (fxe.Arguments.ContainsKey(key)) {
                            try {
                                Program.SDS.NeuralC.Add((double) fxe.Arguments[key]);
                            }
                            catch (Exception e) {
                                l.err("NeuralProcessorC.Calc - {1} : \n{0}", e.ToString(), key);
                            }
                        }
                    }

                    if (fxe.Operation.StartsWith("CarbonSwitcher.Result")) {
                        var key = "C";
                        //InstantLogger.msg(fxe.ToString());
                        try {
                            //Carbon = (double)fxe.Arguments[key];
                            //Program.CurrentCalcCarbone = (double)fxe.Arguments[key];
                            Program.SDS.CCalc.Add((double) fxe.Arguments[key]);
                        }
                        catch (Exception e) {
                            InstantLogger.err("CarbonSwitcher.Result - {1} : \n{0}", e.ToString(), key);
                        }
                    }

                    if (fxe.Operation.StartsWith("UDP.OffGasAnalysisEvent")) {
                        var key = "H2";
                        try {
                            Program.SDS.H2Perc.Add((double) fxe.Arguments[key]);
                            key = "O2";
                            Program.SDS.O2Perc.Add((double) fxe.Arguments[key]);
                            key = "CO";
                            Program.SDS.COPerc.Add((double) fxe.Arguments[key]);
                            key = "CO2";
                            Program.SDS.CO2Perc.Add((double) fxe.Arguments[key]);
                            key = "N2";
                            Program.SDS.N2Perc.Add((double) fxe.Arguments[key]);
                            key = "Ar";
                            Program.SDS.ArPerc.Add((double) fxe.Arguments[key]);
                        }
                        catch (Exception e) {
                            InstantLogger.err("UDP.OffGasAnalysisEvent - {1} : \n{0}", e.ToString(), key);
                        }
                    }

                    if (fxe.Operation.StartsWith("UniversalCPlus.Result")) {
                        var fex = new FlexHelper(fxe);
                        Program.SDS.UniversalC = fex.GetDbl("C");
                    }
                }
            }
        }