Beispiel #1
0
        public BvsDataViewModel(IThreadNotifier notifier, ICmdListener <IBvsReply65Telemetry> cmdListenerBvsReply65)
        {
            _notifier = notifier;
            _cmdListenerBvsReply65 = cmdListenerBvsReply65;
            BvsReply41TextVm       = new AnyCommandPartViewModel();

            _cmdListenerBvsReply65.DataReceived += CmdListenerBvsReply65OnDataReceived;
        }
        public BsSmDataViewModel(IThreadNotifier notifier, ICmdListener <IBsSmRequest32Data> cmdListenerBsSmRequest32, ICmdListener <IBsSmReply32Data> cmdListenerBsSmReply32)
        {
            _notifier = notifier;
            _cmdListenerBsSmRequest32 = cmdListenerBsSmRequest32;
            _cmdListenerBsSmReply32   = cmdListenerBsSmReply32;

            BsSmRequest32DataBytes = new AnyCommandPartViewModel();
            BsSmReply32DataBytes   = new AnyCommandPartViewModel();

            _cmdListenerBsSmRequest32.DataReceived += CmdListenerBsSmRequest32OnDataReceived;
            _cmdListenerBsSmReply32.DataReceived   += CmdListenerBsSmReply32OnDataReceived;
        }
        public MukVaporizerFanDataViewModelParamcentric(IThreadNotifier notifier,
                                                        IParameterSetter parameterSetter, IReceiverModbusRtu rtuReceiver,
                                                        ICmdListener <IMukFanVaporizerDataReply03> cmdListenerMukVaporizerReply03,
                                                        ICmdListener <IMukFanVaporizerDataRequest16> cmdListenerMukVaporizerRequest16)
        {
            _notifier = notifier;

            _cmdListenerMukVaporizerReply03 = cmdListenerMukVaporizerReply03;
            _cmdListenerMukVaporizerReply03.DataReceived += CmdListenerMukVaporizerReply03OnDataReceived;

            _cmdListenerMukVaporizerRequest16 = cmdListenerMukVaporizerRequest16;
            _cmdListenerMukVaporizerRequest16.DataReceived += CmdListenerMukVaporizerRequest16OnDataReceived;

            _children = new List <IGroupItem>();

            var pwmParameter = new ReceivableModbusRtuParameterSimpleViewModel("Уставка ШИМ на вентилятор", 3, 3, 0,
                                                                               new BytesPairNullableToStringThroughDoubleConverter(1.0, 0.0, false, true, "f0"));
            var t1Parameter = new ReceivableModbusRtuParameterSimpleViewModel("Температура 1wire адрес 1", 3, 3, 1,
                                                                              new BytesPairNullableToStringThroughOneWireConverter(0.01, 0.0, "f2", new BytesPair(0x85, 0x00)));
            var t2Parameter = new ReceivableModbusRtuParameterSimpleViewModel("Температура 1wire адрес 2", 3, 3, 2,
                                                                              new BytesPairNullableToStringThroughOneWireConverter(0.01, 0.0, "f2", new BytesPair(0x85, 0x00)));
            var inputSignals = new ReceivableModbusRtuParameterSimpleViewModel("Байт входных сигналов (резерв)", 3, 3,
                                                                               3, new BytesPairNullableToStringThroughDoubleConverter(1.0, 0.0, false, true, "f0"));
            var outputSignals = new ReceivableModbusRtuParameterSimpleViewModel("Байт выходных сигналов (резерв)", 3, 3,
                                                                                4, new BytesPairNullableToStringThroughDoubleConverter(1.0, 0.0, false, true, "f0"));
            var pwmCalorifer = new ReceivableModbusRtuParameterSimpleViewModel("ШИМ на калорифер", 3, 3, 5,
                                                                               new BytesPairNullableToStringThroughDoubleConverter(1.0, 0.0, false, true, "f0"));
            var workStage = new ReceivableModbusRtuParameterSimpleViewModel("Этап работы", 3, 3, 6,
                                                                            new BytesPairNullableToStringThroughVaporizerFanWorkstageConverter());


            rtuReceiver.RegisterParamToReceive(pwmParameter);
            rtuReceiver.RegisterParamToReceive(t1Parameter);
            rtuReceiver.RegisterParamToReceive(t2Parameter);
            rtuReceiver.RegisterParamToReceive(inputSignals);
            rtuReceiver.RegisterParamToReceive(outputSignals);
            rtuReceiver.RegisterParamToReceive(pwmCalorifer);
            rtuReceiver.RegisterParamToReceive(workStage);

            _children.Add(pwmParameter);
            _children.Add(t1Parameter);
            _children.Add(t2Parameter);

            _children.Add(inputSignals);
            _children.Add(outputSignals);
            _children.Add(pwmCalorifer);
            _children.Add(workStage);

            MukFanVaporizerDataReply03Text = new AnyCommandPartViewModel();
            Request16TelemetryText         = new AnyCommandPartViewModel();
            MukVaporizerSetParamsVm        = new MukVaporizerSetParamsViewModel(notifier, parameterSetter);
        }
        public BsSmDataViewModel(IThreadNotifier notifier, ICmdListener <IBsSmAndKsm1DataCommand32Request> cmdListenerBsSmRequest32, ICmdListener <IBsSmAndKsm1DataCommand32Reply> cmdListenerBsSmReply32)
        {
            _notifier = notifier;

            BsSmAndKsm1RequestDataTextVm = new AnyCommandPartViewModel();
            BsSmAndKsm1ReplyDataTextVm   = new AnyCommandPartViewModel();

            _cmdListenerBsSmRequest32 = cmdListenerBsSmRequest32;
            _cmdListenerBsSmReply32   = cmdListenerBsSmReply32;

            _cmdListenerBsSmRequest32.DataReceived += CmdListenerBsSmRequest32OnDataReceived;
            _cmdListenerBsSmReply32.DataReceived   += CmdListenerBsSmReply32OnDataReceived;
        }
Beispiel #5
0
        public MukWarmFloorDataViewModel(IThreadNotifier notifier, IParameterSetter parameterSetter, ICmdListener <IMukWarmFloorReply03Data> reply03Listener, ICmdListener <IMukWarmFloorRequest16Data> request16Listener)
        {
            _notifier          = notifier;
            _reply03Listener   = reply03Listener;
            _request16Listener = request16Listener;

            Reply03BytesTextVm   = new AnyCommandPartViewModel();
            Request16BytesTextVm = new AnyCommandPartViewModel();

            MukWarmFloorSetParamsVm = new MukWarmFloorSetParamsViewModel(notifier, parameterSetter);

            _reply03Listener.DataReceived   += Reply03ListenerOnDataReceived;
            _request16Listener.DataReceived += Request16ListenerOnDataReceived;
        }
        public MukAirExhausterDataViewModel(IThreadNotifier notifier, IParameterSetter parameterSetter, ICmdListener <IMukAirExhausterReply03Data> cmdListenerMukAirExhausterReply03, ICmdListener <IMukFanAirExhausterRequest16Data> cmdListenerMukAirExhausterRequest16)
        {
            _notifier = notifier;
            _cmdListenerMukAirExhausterReply03   = cmdListenerMukAirExhausterReply03;
            _cmdListenerMukAirExhausterRequest16 = cmdListenerMukAirExhausterRequest16;

            Reply03TelemetryText   = new AnyCommandPartViewModel();
            Request16TelemetryText = new AnyCommandPartViewModel();

            MukAirExhausterSetParamsVm = new MukAirExhausterSetParamsViewModel(notifier, parameterSetter);

            _cmdListenerMukAirExhausterReply03.DataReceived   += CmdListenerMukAirExhausterReply03OnDataReceived;
            _cmdListenerMukAirExhausterRequest16.DataReceived += CmdListenerMukAirExhausterRequest16OnDataReceived;
        }
Beispiel #7
0
        public MukFridgeFanDataViewModel(
            IThreadNotifier notifier,
            IParameterSetter parameterSetter,
            ICmdListener <IMukCondensorFanReply03Data> cmdListenerMukFridgeFanReply03,
            ICmdListener <IMukCondenserRequest16Data> cmdListenerMukCondenserRequest16)
        {
            _notifier = notifier;
            _cmdListenerMukFridgeFanReply03   = cmdListenerMukFridgeFanReply03;
            _cmdListenerMukCondenserRequest16 = cmdListenerMukCondenserRequest16;

            Reply03DataText = new AnyCommandPartViewModel();

            Request16DataText    = new AnyCommandPartViewModel();
            MukFridgeSetParamsVm = new MukFridgeSetParamsViewModel(notifier, parameterSetter);

            _cmdListenerMukFridgeFanReply03.DataReceived   += CmdListenerMukFridgeFanReply03OnDataReceived;
            _cmdListenerMukCondenserRequest16.DataReceived += CmdListenerMukCondenserRequest16OnDataReceived;
        }
        public MukFlapDataViewModel(
            ISharedMainViewModel mainVm,
            IThreadNotifier notifier,
            IParameterSetter parameterSetter,
            ICmdListener <IMukFlapOuterAirReply03Telemetry> cmdListenerMukFlapOuterAirReply03,
            ICmdListener <IMukFlapOuterAirRequest16Data> cmdListenerMukFlapOuterAirRequest16)
        {
            MainVm    = mainVm;
            _notifier = notifier;
            _cmdListenerMukFlapOuterAirReply03   = cmdListenerMukFlapOuterAirReply03;
            _cmdListenerMukFlapOuterAirRequest16 = cmdListenerMukFlapOuterAirRequest16;
            Reply03TelemetryText   = new AnyCommandPartViewModel();
            Request16TelemetryText = new AnyCommandPartViewModel();

            MukFlapOuterAirSetParamsVm = new MukFlapOuterAirSetParamsViewModel(notifier, parameterSetter);
            _cmdListenerMukFlapOuterAirReply03.DataReceived   += CmdListenerMukFlapOuterAirReply03OnDataReceived;
            _cmdListenerMukFlapOuterAirRequest16.DataReceived += CmdListenerMukFlapOuterAirRequest16OnDataReceived;
        }
        public KsmDataViewModel(IThreadNotifier notifier, IParameterSetter parameterSetter, ICmdListener <IList <BytesPair> > cmdListenerKsmParams)
        {
            _notifier             = notifier;
            _cmdListenerKsmParams = cmdListenerKsmParams;
            _itemsToWrite         = new BlockingCollection <Tuple <int, ushort, Action <Exception> > >();
            _parameterVmList      = new List <IReceivableParameter>
            {
                new KsmReadonlyParamViewModel(0, "Датчик 1wire №1", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")), new KsmReadonlyParamViewModel(1, "Датчик 1wire №2 ", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")), new KsmReadonlyParamViewModel(2, "Датчик 1wire №3", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")), new KsmReadonlyParamViewModel(3, "Датчик 1wire №4", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")), new KsmReadonlyParamViewModel(4, "Датчик 1wire №5", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")), new KsmBitsParameterViewModel(5, "PIC порт A", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel>
                {
                    new KsmBitParameterViewModel(4, "PA.4 = 0. Подогрев картера, включение"),
                }),
                new KsmBitsParameterViewModel(6, "PIC порт C", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel>
                {
                    new KsmBitParameterViewModel(2, "PC.2 = 0: Клапан разгрузки кондиционера, включение"),
                    new KsmBitParameterViewModel(6, "PC.6 = 0: Включение реле разрешения подачи питания на компрессор"),
                }),
                new KsmBitsParameterViewModel(7, "Диагностика контроллера (ErrorsFlags)", new TextFormatterBits(UnknownBits), null),
                new KsmReadonlyParamViewModel(8, "Этап работы", new TextFormatterSimple("f2", "хз")),
                new KsmBitsParameterViewModel(9, "Регистр аварий в режиме включено", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(10, "Регистр аварий в режиме резерв", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(11, "Регистр аварий в режиме отстой", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(12, "Регистр аварий в режиме обслуживание", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(13, "Регистр аварий в режиме мойка", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(14, "Регистр аварий в режиме ручной", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(15, "Регистр аварий в режиме выключено", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(16, "Состояние обмена 1 (ErrorsResponse), 1 = ошибка обмена", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel>
                {
                    new KsmBitParameterViewModel(0, "b.0 - вычитка текущих данных из МУК заслонки наружного воздуха"),
                    new KsmBitParameterViewModel(1, "b.1 - запись команд в МУК заслонки наружного воздуха"),
                    new KsmBitParameterViewModel(2, "b.2 - вычитка текущих данных из МУК испарителя"),
                    new KsmBitParameterViewModel(3, "b.3 - запись команд в МУК испарителя"),
                    new KsmBitParameterViewModel(4, "b.4 - вычитка текущих данных из МУК конденсатора"),
                    new KsmBitParameterViewModel(5, "b.5 - запись команд в МУК конденсатора"),
                    new KsmBitParameterViewModel(6, "b.6 - вычитка текущих данных из МУК теплого пола"),
                    new KsmBitParameterViewModel(7, "b.7 - запись команд в МУК теплого пола")
                }),
                new KsmBitsParameterViewModel(17, "Состояние обмена 2 (ErrorsResponse), 1 = ошибка обмена", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel>
                {
                    new KsmBitParameterViewModel(0, "b.0 - обмен с БС-СМ"),
                    new KsmBitParameterViewModel(1, "b.1 - обмен с БВС"),
                    new KsmBitParameterViewModel(2, "b.2 - запись данных в РПД"),
                    new KsmBitParameterViewModel(3, "b.3 - вычитка корректируемого параметра из программы технического абонента"),
                    new KsmBitParameterViewModel(4, "b.4 - отсылка текущих данных техническому абоненту")
                }),
                new KsmReadonlyParamViewModel(18, "Уставка ШИМ на клапан", new TextFormatterSimple("f2", "хз")),
                new KsmReadonlyParamViewModel(19, "Ручной принудительный режим", new TextFormatterSimple("f2", "хз")),
                new KsmBitsParameterViewModel(20, "PIC порт B", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel>
                {
                    new KsmBitParameterViewModel(1, "PB.1 = 1: аварийное отключение"),
                })
            };

            for (int i = 21; i < 27; ++i)
            {
                _parameterVmList.Add(new KsmReadonlyParamViewModel(i, "Параметр " + i, new TextFormatterSimple("f2", "хз")));
            }

            _parameterVmList.Add(new KsmReadonlyParamViewModel(27, "Версия ПО", new TextFormatterDotted("хз")));

            _parameterVmList.Add(new SettableParameterViewModel(28, "Максимальный ШИМ (PWMmax_cool)", 255, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(29, "Минимальный ШИМ (PWMmin_cool)", 255, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));

            _parameterVmList.Add(new SettableParameterViewModel(30, "Дельта + (plus_cool)", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(31, "Дельта - (minus_cool)", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));

            _parameterVmList.Add(new SettableParameterViewModel(32, "Компрессор,  почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(33, "Вентилятор конденсатора, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(34, "Отопитель 380 в., почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(35, "Вентилятор приточного воздуха, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(36, "Дельта уставки температуры, отладка, ЦМР 0.1 0 = -2.5, 50 = +2.5", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));

            var converter   = new WarmOrCoolForcedModeToStringConverter();
            var bpConverter = new BuilderOneToOneFunc <BytesPair, string>(bp =>
            {
                try
                {
                    //Console.WriteLine("Need to convert " + bp.HighFirstSignedValue + " to WarmOrCoolForcedMode");
                    return(converter.Build((WarmOrCoolForcedMode)bp.HighFirstSignedValue));
                }
                catch
                {
                    //Console.WriteLine("Cannot convert value " + bp + " to WarmOrCoolForcedMode");
                    return(converter.Build(WarmOrCoolForcedMode.Unknown));
                }
            });

            _parameterVmList.Add(new WarmOrCoolForcedModeViewModel(37, "Принудительный режим обогрев/охлаждение", null, bpConverter,
                                                                   new List <IRawAndConvertedValues <BytesPair, string> >
            {
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 0), converter.Build(WarmOrCoolForcedMode.AutomaticMode)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 1), converter.Build(WarmOrCoolForcedMode.Cool100Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 2), converter.Build(WarmOrCoolForcedMode.Cool50Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 3), converter.Build(WarmOrCoolForcedMode.Ventilation)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 4), converter.Build(WarmOrCoolForcedMode.Warm100Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 5), converter.Build(WarmOrCoolForcedMode.Warm50Percent))
            },
                                                                   "Режим работы", parameterSetter, _notifier, new BuilderOneToOneFunc <BytesPair, BytesPair>(bp => bp)));

            for (int i = 38; i < 50; ++i)
            {
                _parameterVmList.Add(new SettableParameterViewModel(i, "Параметр", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            }

            DataAsText = new AnyCommandPartViewModel();
            _cmdListenerKsmParams.DataReceived += CmdListenerKsmParamsOnDataReceived;
        }
Beispiel #10
0
        public KsmDataViewModel(IThreadNotifier notifier, IParameterSetter parameterSetter, ICmdListener <IList <BytesPair> > cmdListenerKsmParams)
        {
            _notifier             = notifier;
            _cmdListenerKsmParams = cmdListenerKsmParams;

            _itemsToWrite    = new BlockingCollection <Tuple <int, ushort, Action <Exception> > >();
            _parameterVmList = new List <IReceivableParameter> {
                new KsmReadonlyParamViewModel(0, "Датчик 1wire №1", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")),
                new KsmReadonlyParamViewModel(1, "Датчик 1wire №2 ", new TextFormatterSensor(0.01, 0.0, new BytesPair(0x85, 0x00), "f2", "хз", "обрыв")),
                new KsmReadonlyParamViewModel(2, "Резерв", new TextFormatterNcalcDouble("UshRv * 1.0", "f0", "хз")),
                new KsmReadonlyParamViewModel(3, "Резерв", new TextFormatterNcalcDouble("UshRv * 1.0", "f0", "хз")), new KsmBitsParameterViewModel(4, "PIC порт B", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "PB.0 = 0: сегмент — мастер, иначе слейв"),
                    new KsmBitParameterViewModel(1, "PB.1 = 1: пожар"),
                    new KsmBitParameterViewModel(2, "PB.2 = 0: 100% нагрев калорифера 380 в и калорифера 3кВ с включением вентилятора испарителя"),
                    new KsmBitParameterViewModel(3, "PB.3 = 0: 50 % нагрев 3 кВ калорифера"),
                    new KsmBitParameterViewModel(4, "PB.4 = 0: 100% расход вентилятора испарителя"),
                    new KsmBitParameterViewModel(5, "PB.5 = 0: 50 % охлаждение (30 кВт компрессора) с включением вентиляторов испарителя и конденсатора"),
                    new KsmBitParameterViewModel(6, "PB.6 = 0: 100 % охлаждение (20 кВт и 30 кВт компрессоров) с включением вентиляторов испарителя и конденсатора"),
                }),
                new KsmBitsParameterViewModel(5, "PIC порт A", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(4, "PA.4 = 0: Подогрев картера, включение"),
                }),
                new KsmBitsParameterViewModel(6, "PIC порт C", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(2, "PC.2 = 0: Клапан разгрузки кондиционера, включение"),
                    new KsmBitParameterViewModel(6, "PC.6 = 0: Включение реле разрешения подачи питания на компрессор 1 (20 кВ)"),
                    new KsmBitParameterViewModel(7, "PC.7 = 0: Включение обеззараживателя"),
                }),
                new KsmBitsParameterViewModel(7, "Диагностика контроллера (ErrorsFlags)", new TextFormatterBits(UnknownBits), null),
                new KsmReadonlyParamViewModel(8, "Этап работы", new TextFormatterWorkStage()), new KsmBitsParameterViewModel(9, "Регистр аварий 1 в режиме включено", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "b.0 - Резерв"),
                    new KsmBitParameterViewModel(1, "b.1 - Не пройден тест заслонки зима лето"),
                    new KsmBitParameterViewModel(2, "b.2 - Не пройден тест заслонки рециркуляционного воздуха"),
                    new KsmBitParameterViewModel(3, "b.3 - Не пройден тест вытяжного вентилятора"),
                    new KsmBitParameterViewModel(4, "b.4 - Не пройден тест вентилятора конденсатора"),
                    new KsmBitParameterViewModel(5, "b.5 - Не пройден тест вентилятора испарителя"),
                    new KsmBitParameterViewModel(6, "b.6 - Не пройден тест заслонки наружного воздуха"),
                    new KsmBitParameterViewModel(7, "b.7 - Нет 380 вольт"),
                }),
                new KsmBitsParameterViewModel(10, "Регистр аварий 2 в режиме включено", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "b.0 - Резерв"),
                    new KsmBitParameterViewModel(1, "b.1 - Резерв"),
                    new KsmBitParameterViewModel(2, "b.2 - Не пройден контроль контактора компрессора 2"),
                    new KsmBitParameterViewModel(3, "b.3 - Не пройден контроль контактора компрессора 1"),
                    new KsmBitParameterViewModel(4, "b.4 - Автомат 380 В выключен компрессора 2"),
                    new KsmBitParameterViewModel(5, "b.5 - Автомат 380 В выключен компрессора 1"),
                    new KsmBitParameterViewModel(6, "b.6 - Датчик высокого давления МУКа конденсатора не в диапазоне"),
                    new KsmBitParameterViewModel(7, "b.7 - Датчик низкого давления и температуры от Emerson не в диапазоне")
                }),
                new KsmBitsParameterViewModel(11, "Регистр аварий 3 в режиме включено", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "b.0 - Срабатывание аппаратного отключение компрессора 2 по Pmax"),
                    new KsmBitParameterViewModel(1, "b.1 - Срабатывание аппаратного отключение компрессора 2 по Pmin"),
                    new KsmBitParameterViewModel(2, "b.2 - Срабатывание термостата компрессора 2"),
                    new KsmBitParameterViewModel(3, "b.3 - Не пройден контроль разрешение работы компрессора 2"),
                    new KsmBitParameterViewModel(4, "b.4 - Срабатывание аппаратного отключение компрессора 1 по Pmax"),
                    new KsmBitParameterViewModel(5, "b.5 - Срабатывание аппаратного отключение компрессора 1 по Pmin"),
                    new KsmBitParameterViewModel(6, "b.6 - Срабатывание термостата компрессора 1"),
                    new KsmBitParameterViewModel(7, "b.7 - Не пройден контроль разрешение работы компрессора 1")
                }),
                new KsmBitsParameterViewModel(12, "Регистр аварий в режиме резерв", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(13, "Регистр аварий в режиме отстой", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(14, "Регистр аварий 1 в режиме обслуживание", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(15, "Регистр аварий 2 в режиме обслуживание", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(16, "Регистр аварий 3 в режиме обслуживание", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(17, "Регистр аварий в режиме мойка", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(18, "Регистр аварий 1 в режиме ручной", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(19, "Регистр аварий 2 в режиме ручной", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(20, "Регистр аварий 3 в режиме ручной", new TextFormatterBits(UnknownBits), null),
                new KsmBitsParameterViewModel(21, "Регистр аварий в режиме выключено", new TextFormatterBits(UnknownBits), null), new KsmBitsParameterViewModel(22, "Состояние обмена 1 (ErrorsResponse), 1 = ошибка обмена", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "b.0 - вычитка текущих данных из МУК заслонки наружного воздуха"),
                    new KsmBitParameterViewModel(1, "b.1 - запись команд в МУК заслонки наружного воздуха"),
                    new KsmBitParameterViewModel(2, "b.2 - вычитка текущих данных из МУК испарителя"),
                    new KsmBitParameterViewModel(3, "b.3 - запись команд в МУК испарителя"),
                    new KsmBitParameterViewModel(4, "b.4 - вычитка текущих данных из МУК конденсатора"),
                    new KsmBitParameterViewModel(5, "b.5 - запись команд в МУК конденсатора"),
                    new KsmBitParameterViewModel(6, "b.6 - вычитка текущих данных из МУК вытяжного вентилятора"),
                    new KsmBitParameterViewModel(7, "b.7 - запись команд в МУК вытяжного вентилятора")
                }),
                new KsmBitsParameterViewModel(23, "Состояние обмена 2 (ErrorsResponse), 1 = ошибка обмена", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "b.0 - вычитка текущих данных из МУК рециркуляционной заслонки"),
                    new KsmBitParameterViewModel(1, "b.1 - запись команд в МУК рециркуляционной заслонки"),
                    new KsmBitParameterViewModel(2, "b.2 - вычитка текущих данных из МУК заслонки зима-лето"),
                    new KsmBitParameterViewModel(3, "b.3 - запись команд в МУК заслонки зима-лето"),
                    new KsmBitParameterViewModel(4, "b.4 - обмен с БС-СМ"),
                    new KsmBitParameterViewModel(5, "b.5 - обмен с БВС"),
                    new KsmBitParameterViewModel(6, "b.6 - обмен с БВС2"),
                    new KsmBitParameterViewModel(7, "b.7 - запись данных в РПД")
                }),
                new KsmBitsParameterViewModel(24, "Состояние обмена 3 (ErrorsResponse), 1 = ошибка обмена", new TextFormatterBits(UnknownBits), new List <IKsmBitParameterViewModel> {
                    new KsmBitParameterViewModel(0, "b.0 - вычитка корректируемого параметра из программы технического абонента"),
                    new KsmBitParameterViewModel(1, "b.1 - отсылка текущих данных техническому абоненту")
                }),
                new KsmReadonlyParamViewModel(25, "Уставка ШИМ на клапан разгрузки", new TextFormatterNcalcDouble("UshRv * 1.0", "f0", "хз")),
                new KsmReadonlyParamViewModel(26, "Ручной принудительный режим", new TextFormatterForcedManualMode())
            };

            for (int i = 27; i < 34; ++i)
            {
                _parameterVmList.Add(new KsmReadonlyParamViewModel(i, "Параметр " + (i + 1), new TextFormatterSimple("f2", "хз")));
            }

            _parameterVmList.Add(new KsmReadonlyParamViewModel(34, "Версия ПО", new TextFormatterSimple("f0", "хз")));


            //_settableParameterVmList = new List<SettableParameterViewModel>();

            _parameterVmList.Add(new SettableParameterViewModel(35, "Максимальный ШИМ (PWMmax_cool)", 255, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(36, "Минимальный ШИМ (PWMmin_cool)", 255, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));

            _parameterVmList.Add(new SettableParameterViewModel(37, "Дельта + (plus_cool)", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(38, "Дельта - (minus_cool)", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));

            _parameterVmList.Add(new SettableParameterViewModel(39, "Обеззараживатель, почасовой счетчик работы №1", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(40, "Компрессор этого сегмента, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(41, "Компрессор, счетчик перевключений", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(42, "Вентилятор конденсатора 1, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(43, "Вентилятор конденсатора 2, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(44, "Отопитель 380 в., почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(45, "Отопитель 3000 в., почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(46, "Вентилятор приточного воздуха, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(47, "Вентилятор отработанного воздуха, почасовой счетчик работы", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));

            var converter   = new WarmOrCoolForcedModeToStringConverter();
            var bpConverter = new BuilderOneToOneFunc <BytesPair, string>(bp =>
            {
                try
                {
                    //Console.WriteLine("Need to convert " + bp.HighFirstSignedValue + " to WarmOrCoolForcedMode");
                    return(converter.Build((WarmOrCoolForcedMode)bp.HighFirstSignedValue));
                }
                catch
                {
                    //Console.WriteLine("Cannot convert value " + bp + " to WarmOrCoolForcedMode");
                    return(converter.Build(WarmOrCoolForcedMode.Unknown));
                }
            });

            _parameterVmList.Add(new WarmOrCoolForcedModeViewModel(48, "Принудительный режим обогрев/охлаждение", null, bpConverter, new List <IRawAndConvertedValues <BytesPair, string> > {
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 0), converter.Build(WarmOrCoolForcedMode.AutomaticMode)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 1), converter.Build(WarmOrCoolForcedMode.Cool100Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 2), converter.Build(WarmOrCoolForcedMode.Cool50Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 3), converter.Build(WarmOrCoolForcedMode.Ventilation)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 4), converter.Build(WarmOrCoolForcedMode.Warm100Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 5), converter.Build(WarmOrCoolForcedMode.Warm50Percent)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 6), converter.Build(WarmOrCoolForcedMode.TurnOnUov)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 7), converter.Build(WarmOrCoolForcedMode.Test3000VoltageHeating)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 8), converter.Build(WarmOrCoolForcedMode.Test380VoltageHeating)),
                new RawAndConvertedValuesSimple <BytesPair, string>(new BytesPair(0, 9), converter.Build(WarmOrCoolForcedMode.VentMaxСO2))
            }, "Режим работы", parameterSetter, _notifier, new BuilderOneToOneFunc <BytesPair, BytesPair>(bp => bp)));

            _parameterVmList.Add(new SettableParameterViewModel(49, "Дельта уставки температуры, отладка", 32767 * 0.1 - 2.5, -32767 * 0.1 - 2.5, null, "f1", new DoubleBytesPairConverterModifyAndOffsetUshort(0.1, -2.5), parameterSetter, notifier, null));

            _parameterVmList.Add(new SettableParameterViewModel(50, "Обеззараживатель, почасовой счетчик работы №2", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(51, "Обеззараживатель, почасовой счетчик работы №3", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            _parameterVmList.Add(new SettableParameterViewModel(52, "Обеззараживатель, почасовой счетчик работы №4", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            for (int i = 53; i < 60; ++i)
            {
                _parameterVmList.Add(new SettableParameterViewModel(i, "Параметр", 65535, 0, null, "f0", new DoubleBytesPairConverterSimpleUshort(), parameterSetter, notifier, null));
            }

            DataAsText = new AnyCommandPartViewModel();
            _cmdListenerKsmParams.DataReceived += CmdListenerKsmParamsOnDataReceived;
        }