Ejemplo n.º 1
0
        public IDisplayGroup Build()
        {
            var ksmGroup = new GroupParamViewModel("КСМ");
            //const string reply03GroupName = "МУК 8, заслонка зима лето";
            // setting group of settable params

            var setParamsGroup = new GroupParamViewModel("Параметры КСМ");

            #region param39

            var recvParam39 = new RecvParam <int, IList <BytesPair> >("39: Обеззараживатель, почасовой счетчик работы (CounterCleaner)", _cmdListenerKsmParams, data => data[39].LowFirstUnsignedValue);
            var setParam39  = new SettParamViewModel <int>(recvParam39.ReceiveName, _uiNotifier, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(39, (ushort)val, callback));

            var dispsetParameter39 = new DispParamSettableViewModel <int, int, int>(recvParam39.ReceiveName, recvParam39, _uiNotifier, i => i, 0, 0, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(39, (ushort)val, callback));

            var aggSetParam39 = new ChartParamViewModel <int, int>(recvParam39, dispsetParameter39, i => i, ParameterLogType.Analogue, _parameterLogger, setParamsGroup.DisplayName);
            setParamsGroup.AddParameterOrGroup(aggSetParam39);

            #endregion

            ksmGroup.AddParameterOrGroup(setParamsGroup);
            return(ksmGroup);
        }
Ejemplo n.º 2
0
        public IDisplayGroup Build()
        {
            var timeCountersGroup = new GroupParamViewModel("Моточасы: ");
            //const string reply03GroupName = "МУК 8, заслонка зима лето";



            // setting group of settable params
            //var setParamsGroup = new GroupParamViewModel("Параметры КСМ");

            var recvParam39 = new RecvParam <int, IList <BytesPair> >("39: Обеззараживатель, почасовой счетчик работы №1", _cmdListenerKsmParams, data => data[39].HighFirstUnsignedValue);
            var setParam39  = new SettParamViewModel <int>(recvParam39.ReceiveName, _uiNotifier, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(39, (ushort)val, callback));

            var dispsetParameter39 = new DispParamSettableViewModel <int, int, int>(recvParam39.ReceiveName, recvParam39, _uiNotifier, i => i, 0, 0, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(39, (ushort)val, callback));


            var recvParam50 = new RecvParam <int, IList <BytesPair> >("50: Обеззараживатель, почасовой счетчик работы №2", _cmdListenerKsmParams, data => data[50].HighFirstUnsignedValue);
            var setParam50  = new SettParamViewModel <int>(recvParam50.ReceiveName, _uiNotifier, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(50, (ushort)val, callback));

            var dispsetParameter50 = new DispParamSettableViewModel <int, int, int>(recvParam50.ReceiveName, recvParam50, _uiNotifier, i => i, 0, 0, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(50, (ushort)val, callback));

            var recvParam51 = new RecvParam <int, IList <BytesPair> >("51: Обеззараживатель, почасовой счетчик работы №3", _cmdListenerKsmParams, data => data[51].HighFirstUnsignedValue);
            var setParam51  = new SettParamViewModel <int>(recvParam51.ReceiveName, _uiNotifier, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(51, (ushort)val, callback));

            var dispsetParameter51 = new DispParamSettableViewModel <int, int, int>(recvParam51.ReceiveName, recvParam51, _uiNotifier, i => i, 0, 0, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(51, (ushort)val, callback));

            var recvParam52 = new RecvParam <int, IList <BytesPair> >("52: Обеззараживатель, почасовой счетчик работы №4", _cmdListenerKsmParams, data => data[52].HighFirstUnsignedValue);
            var setParam52  = new SettParamViewModel <int>(recvParam52.ReceiveName, _uiNotifier, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(52, (ushort)val, callback));

            var dispsetParameter52 = new DispParamSettableViewModel <int, int, int>(recvParam52.ReceiveName, recvParam52, _uiNotifier, i => i, 0, 0, val =>
            {
                if (val < 0 || val > 65535)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(52, (ushort)val, callback));


            // defining version of app, if full then using checkboxVm, else without checkbox:
            IDisplayParameter setParam39Vm = _version == AppVersion.Full ? (IDisplayParameter) new ChartParamViewModel <int, int>(recvParam39, dispsetParameter39, i => i, ParameterLogType.Analogue, _parameterLogger, timeCountersGroup.DisplayName) : new AggregateParamViewModel <int>(dispsetParameter39, timeCountersGroup.DisplayName);
            IDisplayParameter setParam50Vm = _version == AppVersion.Full ? (IDisplayParameter) new ChartParamViewModel <int, int>(recvParam50, dispsetParameter50, i => i, ParameterLogType.Analogue, _parameterLogger, timeCountersGroup.DisplayName) : new AggregateParamViewModel <int>(dispsetParameter50, timeCountersGroup.DisplayName);
            IDisplayParameter setParam51Vm = _version == AppVersion.Full ? (IDisplayParameter) new ChartParamViewModel <int, int>(recvParam51, dispsetParameter51, i => i, ParameterLogType.Analogue, _parameterLogger, timeCountersGroup.DisplayName) : new AggregateParamViewModel <int>(dispsetParameter51, timeCountersGroup.DisplayName);
            IDisplayParameter setParam52Vm = _version == AppVersion.Full ? (IDisplayParameter) new ChartParamViewModel <int, int>(recvParam52, dispsetParameter52, i => i, ParameterLogType.Analogue, _parameterLogger, timeCountersGroup.DisplayName) : new AggregateParamViewModel <int>(dispsetParameter52, timeCountersGroup.DisplayName);


            timeCountersGroup.AddParameterOrGroup(setParam39Vm);
            timeCountersGroup.AddParameterOrGroup(setParam50Vm);
            timeCountersGroup.AddParameterOrGroup(setParam51Vm);
            timeCountersGroup.AddParameterOrGroup(setParam52Vm);

            //timeCountersGroup.AddParameterOrGroup(timeCountersGroup);
            return(timeCountersGroup);
        }
Ejemplo n.º 3
0
        public IDisplayGroup Build()
        {
            var muk08Group = new GroupParamViewModel("МУК 8, заслонка зима лето");
            //const string reply03GroupName = "МУК 8, заслонка зима лето";
            var reply03Group = new GroupParamViewModel("Ответ на команду 3");


            IRecvParam <IList <byte> > mukFlapWinterSummerPwm = new RecvParam <IList <byte>, IList <byte> >("PWM", _cmdListenerWinSum03Reply, bytes => bytes.Skip(1).Take(2).ToList());
            var mukFlapWinterSummerPwmDisplay = new DispParamViewModel <int, IList <byte> >("Уставка ШИМ на клапан", mukFlapWinterSummerPwm, _uiNotifier, bytes => bytes[0] * 256 + bytes[1], 0, -1);
            var mukFlapWinterSummerPwmChart   = new ChartParamViewModel <IList <byte>, int>(mukFlapWinterSummerPwm, mukFlapWinterSummerPwmDisplay, data => data[0] * 256.0 + data[1], ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterSummerPwmChart);


            IRecvParam <IList <byte> > mukFlapWinterTemperatureOneWireAddr1 = new RecvParam <IList <byte>, IList <byte> >("T1W1", _cmdListenerWinSum03Reply, bytes => bytes.Skip(3).Take(2).ToList());
            var mukFlapWinterTemperatureOneWireAddr1Display = new DispParamViewModel <string, IList <byte> >("Температура 1w адрес 1", mukFlapWinterTemperatureOneWireAddr1, _uiNotifier, bytes => new SensorIndicationDoubleBasedOnBytesPair(new BytesPair(bytes[0], bytes[1]), 0.01, 0.0, new BytesPair(0x85, 0x00)).ToString(d => d.ToString("f2")), "ER", "??");
            var mukFlapWinterTemperatureOneWireAddr1Chart   = new ChartParamViewModel <IList <byte>, string>(mukFlapWinterTemperatureOneWireAddr1, mukFlapWinterTemperatureOneWireAddr1Display, data => new SensorIndicationDoubleBasedOnBytesPair(new BytesPair(data[0], data[1]), 0.01, 0.0, new BytesPair(0x85, 0x00)).Indication, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterTemperatureOneWireAddr1Chart);


            IRecvParam <IList <byte> > mukFlapWinterTemperatureOneWireAddr2 = new RecvParam <IList <byte>, IList <byte> >("T1W2", _cmdListenerWinSum03Reply, bytes => bytes.Skip(5).Take(2).ToList());
            var mukFlapWinterTemperatureOneWireAddr2Display = new DispParamViewModel <string, IList <byte> >("Температура 1w адрес 2", mukFlapWinterTemperatureOneWireAddr2, _uiNotifier, bytes => new SensorIndicationDoubleBasedOnBytesPair(new BytesPair(bytes[0], bytes[1]), 0.01, 0.0, new BytesPair(0x85, 0x00)).ToString(d => d.ToString("f2")), "ER", "??");
            var mukFlapWinterTemperatureOneWireAddr2Chart   = new ChartParamViewModel <IList <byte>, string>(mukFlapWinterTemperatureOneWireAddr2, mukFlapWinterTemperatureOneWireAddr2Display, data => new SensorIndicationDoubleBasedOnBytesPair(new BytesPair(data[0], data[1]), 0.01, 0.0, new BytesPair(0x85, 0x00)).Indication, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterTemperatureOneWireAddr2Chart);


            IRecvParam <IList <byte> > mukFlapWinterIncomingSignals = new RecvParam <IList <byte>, IList <byte> >("Байт входных сигналов", _cmdListenerWinSum03Reply, bytes => bytes.Skip(7).Take(1).ToList());
            var groupIncomingSignals = new GroupParamViewModel(mukFlapWinterIncomingSignals.ReceiveName);

            reply03Group.AddParameterOrGroup(groupIncomingSignals);

            var mukFlapWinterIsigTurnEmrson1OnDisplay = new DispParamViewModel <bool, IList <byte> >("Сигнал на включение Emersion1", mukFlapWinterIncomingSignals, _uiNotifier, bytes => bytes[0].GetBit(6), false, false);
            var mukFlapWinterIsigTurnEmrson1OnChart   = new ChartParamViewModel <IList <byte>, bool>(mukFlapWinterIncomingSignals, mukFlapWinterIsigTurnEmrson1OnDisplay, data => data[0].GetBit(6) ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupIncomingSignals.DisplayName);

            groupIncomingSignals.AddParameterOrGroup(mukFlapWinterIsigTurnEmrson1OnChart);


            var mukFlapWinterIsigTurnEmrson2OnDisplay = new DispParamViewModel <bool, IList <byte> >("Сигнал на включение Emersion2", mukFlapWinterIncomingSignals, _uiNotifier, bytes => bytes[0].GetBit(7), false, false);
            var mukFlapWinterIsigTurnEmrson2OnChart   = new ChartParamViewModel <IList <byte>, bool>(mukFlapWinterIncomingSignals, mukFlapWinterIsigTurnEmrson2OnDisplay, data => data[0].GetBit(7) ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupIncomingSignals.DisplayName);

            groupIncomingSignals.AddParameterOrGroup(mukFlapWinterIsigTurnEmrson2OnChart);


            IRecvParam <IList <byte> > mukFlapWinterOutgoingSignals = new RecvParam <IList <byte>, IList <byte> >("Байт выходных сигналов", _cmdListenerWinSum03Reply, bytes => bytes.Skip(9).Take(1).ToList());
            var mukFlapWinterOutgoingSignalsDisplay = new DispParamViewModel <int, IList <byte> >(mukFlapWinterOutgoingSignals.ReceiveName, mukFlapWinterOutgoingSignals, _uiNotifier, bytes => bytes[0], 0, -1);
            var mukFlapWinterOutgoingSignalsChart   = new ChartParamViewModel <IList <byte>, int>(mukFlapWinterOutgoingSignals, mukFlapWinterOutgoingSignalsDisplay, data => data[0], ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterOutgoingSignalsChart);


            IRecvParam <IList <byte> > mukFlapWinterSummerAnalogueInput = new RecvParam <IList <byte>, IList <byte> >("Аналоговый вход от заслонки", _cmdListenerWinSum03Reply, bytes => bytes.Skip(11).Take(2).ToList());
            var mukFlapWinterSummerAnalogueInputDisplay = new DispParamViewModel <string, IList <byte> >(mukFlapWinterSummerAnalogueInput.ReceiveName, mukFlapWinterSummerAnalogueInput, _uiNotifier, data => ((data[0] * 256 + data[1]) * 0.1).ToString("f1"), "ER", "??");
            var mukFlapWinterSummerAnalogueInputChart   = new ChartParamViewModel <IList <byte>, string>(mukFlapWinterSummerAnalogueInput, mukFlapWinterSummerAnalogueInputDisplay, data => (data[0] * 256 + data[1]) * 0.1, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterSummerAnalogueInputChart);


            IRecvParam <IList <byte> > mukFlapWinterSummerAutomaticModeStage = new RecvParam <IList <byte>, IList <byte> >("Этап работы", _cmdListenerWinSum03Reply, bytes => bytes.Skip(13).Take(2).ToList());
            var mukFlapWinterSummerAutomaticModeStageDisplay = new DispParamViewModel <string, IList <byte> >(mukFlapWinterSummerAutomaticModeStage.ReceiveName, mukFlapWinterSummerAutomaticModeStage, _uiNotifier, data => new MukFlapWorkmodeStageBuilder(data[0] * 256 + data[1]).Build().ToText(), "ER", "??");
            var mukFlapWinterSummerAutomaticModeStageChart   = new ChartParamViewModel <IList <byte>, string>(mukFlapWinterSummerAutomaticModeStage, mukFlapWinterSummerAutomaticModeStageDisplay, data => data[0] * 256 + data[1], ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterSummerAutomaticModeStageChart);


            var groupDiagnostic1 = new GroupParamViewModel("Диагностика 1");

            reply03Group.AddParameterOrGroup(groupDiagnostic1);
            IRecvParam <IList <byte> > mukFlapWinterSummerDiagnostic1 = new RecvParam <IList <byte>, IList <byte> >(groupDiagnostic1.DisplayName, _cmdListenerWinSum03Reply, bytes => bytes.Skip(15).Take(2).ToList());

            /*var diagnostic1NoConnectionToEmersonDisplay = new DispParamViewModel<bool, IList<byte>>("Нет связи с Emerson", mukFlapWinterSummerDiagnostic1, _uiNotifier, bytes => bytes[1].GetBit(4), false, false);
             * var diagnostic1NoConnectionToEmersonChart = new ChartParamViewModel<IList<byte>, bool>(mukFlapWinterSummerDiagnostic1, diagnostic1NoConnectionToEmersonDisplay, data => data[1].GetBit(4) ? 1.0 : 0.0, ParameterLogType.Discrete, ParameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic1.DisplayName);
             * groupDiagnostic1.ParametersAndGroups.Add(diagnostic1NoConnectionToEmersonChart);
             */


            var diagnostic1OneWire1ErrorDisplay = new DispParamViewModel <bool, IList <byte> >("Ошибка датчика 1w №1", mukFlapWinterSummerDiagnostic1, _uiNotifier, bytes => bytes[1].GetBit(6), false, false);
            var diagnostic1OneWire1ErrorChart   = new ChartParamViewModel <IList <byte>, bool>(mukFlapWinterSummerDiagnostic1, diagnostic1OneWire1ErrorDisplay, data => data[1].GetBit(6) ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic1.DisplayName);

            groupDiagnostic1.ParametersAndGroups.Add(diagnostic1OneWire1ErrorChart);


            var diagnostic1OneWire2ErrorDisplay = new DispParamViewModel <bool, IList <byte> >("Ошибка датчика 1w №2", mukFlapWinterSummerDiagnostic1, _uiNotifier, bytes => bytes[1].GetBit(7), false, false);
            var diagnostic1OneWire2ErrorChart   = new ChartParamViewModel <IList <byte>, bool>(mukFlapWinterSummerDiagnostic1, diagnostic1OneWire2ErrorDisplay, data => data[1].GetBit(7) ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic1.DisplayName);

            groupDiagnostic1.ParametersAndGroups.Add(diagnostic1OneWire2ErrorChart);


            IRecvParam <IList <byte> > diagnostic2Recv = new RecvParam <IList <byte>, IList <byte> >("Диагностика 2", _cmdListenerWinSum03Reply, bytes => bytes.Skip(17).Take(2).ToList());
            var groupDiagnostic2 = new GroupParamViewModel(diagnostic2Recv.ReceiveName);

            reply03Group.AddParameterOrGroup(groupDiagnostic2);

            var diagnostic2NotReachingLimitDisp  = new DispParamViewModel <bool, IList <byte> >("Заслонка не встает в крайние положения", diagnostic2Recv, _uiNotifier, bytes => bytes[1].GetBit(5), false, false);
            var diagnostic2NotReachingLimitChart = new ChartParamViewModel <IList <byte>, bool>(diagnostic2Recv, diagnostic2NotReachingLimitDisp, data => data[1].GetBit(5) ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic2.DisplayName);

            groupDiagnostic2.AddParameterOrGroup(diagnostic2NotReachingLimitChart);

            var diagnostic2NotCoveringHalfOfTheRangeDisp  = new DispParamViewModel <bool, IList <byte> >("Заслонка не проходит 50% диапазона", diagnostic2Recv, _uiNotifier, bytes => bytes[1].GetBit(6), false, false);
            var diagnostic2NotCoveringHalfOfTheRangeChart = new ChartParamViewModel <IList <byte>, bool>(diagnostic2Recv, diagnostic2NotCoveringHalfOfTheRangeDisp, data => data[1].GetBit(6) ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic2.DisplayName);

            groupDiagnostic2.AddParameterOrGroup(diagnostic2NotCoveringHalfOfTheRangeChart);


            IRecvParam <IMukFlapDiagnosticOneWireSensor> diagnostic3Recv = new RecvParam <IMukFlapDiagnosticOneWireSensor, IList <byte> >("Диагностика 3, 1w адрес 1", _cmdListenerWinSum03Reply, bytes => new MukFlapDiagnosticOneWireSensorBuilder(bytes[20]).Build());
            var groupDiagnostic3 = new GroupParamViewModel(diagnostic3Recv.ReceiveName);

            reply03Group.AddParameterOrGroup(groupDiagnostic3);
            var diagnostic3SensorErrorDisp  = new DispParamViewModel <bool, IMukFlapDiagnosticOneWireSensor>("Ошибка датчика", diagnostic3Recv, _uiNotifier, d => d.OneWireSensorError, false, false);
            var diagnostic3SensorErrorChart = new ChartParamViewModel <IMukFlapDiagnosticOneWireSensor, bool>(diagnostic3Recv, diagnostic3SensorErrorDisp, diag => diag.OneWireSensorError ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic3.DisplayName);

            groupDiagnostic3.AddParameterOrGroup(diagnostic3SensorErrorChart);


            var diagnostic3SensorErrorCodeDisp  = new DispParamViewModel <string, IMukFlapDiagnosticOneWireSensor>("Код ошибки датчика", diagnostic3Recv, _uiNotifier, diag => diag.ErrorCode.AbsoluteValue + " - " + diag.ErrorCode.KnownValue.ToText(), "ER", "?");
            var diagnostic3SensorErrorCodeChart = new ChartParamViewModel <IMukFlapDiagnosticOneWireSensor, string>(diagnostic3Recv, diagnostic3SensorErrorCodeDisp, diag => diag.ErrorCode.AbsoluteValue, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic3.DisplayName);

            groupDiagnostic3.AddParameterOrGroup(diagnostic3SensorErrorCodeChart);


            var diagnostic3SensorErrorsCountDisp  = new DispParamViewModel <string, IMukFlapDiagnosticOneWireSensor>("Количество ошибок связи", diagnostic3Recv, _uiNotifier, diag => diag.LinkErrorCount.Value.ToString(), "ER", "?");
            var diagnostic3SensorErrorsCountChart = new ChartParamViewModel <IMukFlapDiagnosticOneWireSensor, string>(diagnostic3Recv, diagnostic3SensorErrorsCountDisp, diag => diag.LinkErrorCount.Value, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic1.DisplayName);

            groupDiagnostic3.AddParameterOrGroup(diagnostic3SensorErrorsCountChart);


            IRecvParam <IMukFlapDiagnosticOneWireSensor> diagnostic4Recv = new RecvParam <IMukFlapDiagnosticOneWireSensor, IList <byte> >("Диагностика 4, 1w адрес 2", _cmdListenerWinSum03Reply, bytes => new MukFlapDiagnosticOneWireSensorBuilder(bytes[22]).Build());
            var groupDiagnostic4 = new GroupParamViewModel(diagnostic4Recv.ReceiveName);

            reply03Group.AddParameterOrGroup(groupDiagnostic4);
            var diagnostic4SensorErrorDisp  = new DispParamViewModel <bool, IMukFlapDiagnosticOneWireSensor>("Ошибка датчика", diagnostic4Recv, _uiNotifier, d => d.OneWireSensorError, false, false);
            var diagnostic4SensorErrorChart = new ChartParamViewModel <IMukFlapDiagnosticOneWireSensor, bool>(diagnostic4Recv, diagnostic4SensorErrorDisp, diag => diag.OneWireSensorError ? 1.0 : 0.0, ParameterLogType.Discrete, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic4.DisplayName);

            groupDiagnostic4.AddParameterOrGroup(diagnostic4SensorErrorChart);


            var diagnostic4SensorErrorCodeDisp  = new DispParamViewModel <string, IMukFlapDiagnosticOneWireSensor>("Код ошибки датчика", diagnostic4Recv, _uiNotifier, diag => diag.ErrorCode.AbsoluteValue + " - " + diag.ErrorCode.KnownValue.ToText(), "ER", "?");
            var diagnostic4SensorErrorCodeChart = new ChartParamViewModel <IMukFlapDiagnosticOneWireSensor, string>(diagnostic4Recv, diagnostic4SensorErrorCodeDisp, diag => diag.ErrorCode.AbsoluteValue, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic4.DisplayName);

            groupDiagnostic4.AddParameterOrGroup(diagnostic4SensorErrorCodeChart);


            var diagnostic4SensorErrorsCountDisp  = new DispParamViewModel <string, IMukFlapDiagnosticOneWireSensor>("Количество ошибок связи", diagnostic4Recv, _uiNotifier, diag => diag.LinkErrorCount.Value.ToString(), "ER", "?");
            var diagnostic4SensorErrorsCountChart = new ChartParamViewModel <IMukFlapDiagnosticOneWireSensor, string>(diagnostic4Recv, diagnostic4SensorErrorsCountDisp, diag => diag.LinkErrorCount.Value, ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName, groupDiagnostic4.DisplayName);

            groupDiagnostic4.AddParameterOrGroup(diagnostic4SensorErrorsCountChart);


            IRecvParam <IList <byte> > mukFlapWinterSummerFwVer = new RecvParam <IList <byte>, IList <byte> >("Версия ПО МУК заслонки", _cmdListenerWinSum03Reply, bytes => bytes.Skip(39).Take(2).ToList());
            var mukFlapWinterSummerFwVerDisplay = new DispParamViewModel <int, IList <byte> >(mukFlapWinterSummerFwVer.ReceiveName, mukFlapWinterSummerFwVer, _uiNotifier, bytes => bytes[0] * 256 + bytes[1], 0, -1);
            var mukFlapWinterSummerFwVerChart   = new ChartParamViewModel <IList <byte>, int>(mukFlapWinterSummerFwVer, mukFlapWinterSummerFwVerDisplay, data => data[0] * 256.0 + data[1], ParameterLogType.Analogue, _parameterLogger, muk08Group.DisplayName, reply03Group.DisplayName);

            reply03Group.AddParameterOrGroup(mukFlapWinterSummerFwVerChart);


            // setting group of settable params
            var setParamsGroup = new GroupParamViewModel("Уставка параметров");

            var setParam827    = new SettParamViewModel <bool>("827: Ручной/Автоматический режим", _uiNotifier, val => { }, false, false, (val, callback) => _parameterSetter.SetParameterAsync(827, (ushort)(val ? 1 : 0), callback));
            var aggSetParam827 = new AggregateParamViewModel <bool>(setParam827, muk08Group.DisplayName, setParamsGroup.DisplayName);


            var setParam828 = new SettParamViewModel <int>("828: Уставка ШИМ на заслонку в ручном режиме", _uiNotifier, val =>
            {
                if (val < 0 || val > 255)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }, 0, 0, (val, callback) => _parameterSetter.SetParameterAsync(828, (ushort)val, callback));
            var aggSetParam828 = new AggregateParamViewModel <int>(setParam828, muk08Group.DisplayName, setParamsGroup.DisplayName);


            setParamsGroup.AddParameterOrGroup(aggSetParam827);
            setParamsGroup.AddParameterOrGroup(aggSetParam828);


            muk08Group.AddParameterOrGroup(reply03Group);
            muk08Group.AddParameterOrGroup(setParamsGroup);
            return(muk08Group);
        }