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;
        }
Exemple #2
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;
        }