public AinTelemetryViewModel(ICommonAinTelemetryVm commonAinTelemetryVm, byte zeroBasedAinNumber,
                              ICommandSenderHost commandSenderHost, ILogger logger, IUserInterfaceRoot userInterfaceRoot)
 {
     _commonAinTelemetryVm = commonAinTelemetryVm;
     _zeroBasedAinNumber   = zeroBasedAinNumber;
     _commandSenderHost    = commandSenderHost;
     _logger            = logger;
     _userInterfaceRoot = userInterfaceRoot;
     _telemetry         = null;
     _syncCancel        = new object();
     _cancel            = true;
 }
        public void InCycleAction()
        {
            var waiter = new ManualResetEvent(false);


            var cmd = new ReadAinTelemetryCommand(_zeroBasedAinNumber);

            _commandSenderHost.Sender.SendCommandAsync(0x01,
                                                       cmd, TimeSpan.FromSeconds(0.1), 2,
                                                       (exception, bytes) =>
            {
                IAinTelemetry ainTelemetry = null;
                try
                {
                    if (exception != null)
                    {
                        throw new Exception("Произошла ошибка во время обмена", exception);
                    }
                    var result   = cmd.GetResult(bytes);
                    ainTelemetry = result;
                }
                catch (Exception ex)
                {
                    // TODO: log exception, null values
                    //_logger.Log("Ошибка: " + ex.Message);
                    //Console.WriteLine(ex);
                }
                finally
                {
                    _userInterfaceRoot.Notifier.Notify(() =>
                    {
                        //Console.WriteLine("UserInterface thread begin action =============================");
                        //Console.WriteLine("AIN viewModel zbNumber: " + _zeroBasedAinNumber);
                        UpdateTelemetry(ainTelemetry);
                        if (_zeroBasedAinNumber == 0)
                        {
                            _commonAinTelemetryVm.UpdateAinStatuses(ainTelemetry?.Status, null, null);
                        }
                        //Console.WriteLine("UserInterface thread end action ===============================");
                    });
                    waiter.Set();
                }
            });
            waiter.WaitOne();
            waiter.Reset();
        }
        // TODO: other props

        public void UpdateTelemetry(IAinTelemetry telemetry)
        {
            _telemetry = telemetry;

            RaisePropertyChanged(() => RotationFriquencyCalculated);
            RaisePropertyChanged(() => PwmModulationCoefficient);
            RaisePropertyChanged(() => MomentumCurrentSetting);
            RaisePropertyChanged(() => RadiatorTemperature);
            RaisePropertyChanged(() => DcBusVoltage);
            RaisePropertyChanged(() => AllPhasesCurrentAmplitudeEnvelopeCurve);
            RaisePropertyChanged(() => RegulatorCurrentDoutput);
            RaisePropertyChanged(() => RegulatorCurrentQoutput);
            RaisePropertyChanged(() => FriquencyIntensitySetpointOutput);
            RaisePropertyChanged(() => FlowSetting);
            RaisePropertyChanged(() => MeasuredMoment);
            RaisePropertyChanged(() => SpeedRegulatorOutputOrMomentSetting);
            RaisePropertyChanged(() => MeasuredFlow);
            RaisePropertyChanged(() => SettingExcitationCurrent);

            RaisePropertyChanged(() => RunModeBits12);
            RaisePropertyChanged(() => ResetZiToZero);
            RaisePropertyChanged(() => ResetFault);
            RaisePropertyChanged(() => LimitRegulatorId);
            RaisePropertyChanged(() => LimitRegulatorIq);
            RaisePropertyChanged(() => LimitRegulatorSpeed);
            RaisePropertyChanged(() => LimitRegulatorFlow);
            RaisePropertyChanged(() => MomentumSetterSelector);

            RaisePropertyChanged(() => Driver1HasErrors);
            RaisePropertyChanged(() => Driver2HasErrors);
            RaisePropertyChanged(() => Driver3HasErrors);
            RaisePropertyChanged(() => Driver4HasErrors);
            RaisePropertyChanged(() => Driver5HasErrors);
            RaisePropertyChanged(() => Driver6HasErrors);

            RaisePropertyChanged(() => SomePhaseMaximumAlowedCurrentExcess);
            RaisePropertyChanged(() => RadiatorKeysTemperatureRiseTo85DegreesExcess);
            RaisePropertyChanged(() => AllowedDcVoltageExcess);

            RaisePropertyChanged(() => NoLinkOnSyncLine);
            RaisePropertyChanged(() => ExternalTemperatureLimitExcess);
            RaisePropertyChanged(() => RotationFriquecnySensorFault);

            RaisePropertyChanged(() => EepromI2CErrorDefaultParamsAreLoaded);
            RaisePropertyChanged(() => EepromCrcErrorDefaultParamsAreLoaded);

            RaisePropertyChanged(() => SomeSlaveFault);
            RaisePropertyChanged(() => ConfigChangeDuringParallelWorkConfirmationNeed);

            RaisePropertyChanged(() => RotationFriquencyMeasuredDcv);
            RaisePropertyChanged(() => AfterFilterSpeedControllerFeedbackFriquency);
            RaisePropertyChanged(() => AfterFilterFimag);
            RaisePropertyChanged(() => CurrentDpartMeasured);
            RaisePropertyChanged(() => CurrentQpartMeasured);
            RaisePropertyChanged(() => AfterFilterFset);
            RaisePropertyChanged(() => AfterFilterTorq);

            RaisePropertyChanged(() => ExternalTemperature);

            RaisePropertyChanged(() => DCurrentRegulatorProportionalPart);
            RaisePropertyChanged(() => QcurrentRegulatorProportionalPart);
            RaisePropertyChanged(() => SpeedRegulatorProportionalPart);
            RaisePropertyChanged(() => FlowRegulatorProportionalPart);

            RaisePropertyChanged(() => CalculatorDflowRegulatorOutput);
            RaisePropertyChanged(() => CalculatorQflowRegulatorOutput);

            RaisePropertyChanged(() => Aux1);
            RaisePropertyChanged(() => Aux2);
            RaisePropertyChanged(() => Pver);
            RaisePropertyChanged(() => PvDate);

            //EngineState? commonEngineState =
            _commonAinTelemetryVm.UpdateCommonEngineState(_telemetry?.CommonEngineState);
            _commonAinTelemetryVm.UpdateCommonFaultState(_telemetry?.CommonFaultState);
            _commonAinTelemetryVm.UpdateAinsLinkState(
                _telemetry?.Ain1LinkFault,
                _telemetry?.Ain2LinkFault,
                _telemetry?.Ain3LinkFault);
        }