public virtual CameraSettingsDto GetCameraSettings()
        {
            CameraSettingsDto settings = null;

            if (File.Exists("CameraPhotoSettings.xml"))
            {
                using (var fs = File.OpenRead("CameraPhotoSettings.xml"))
                {
                    settings = (CameraSettingsDto) new XmlSerializer(typeof(CameraSettingsDto)).Deserialize(fs);
                }
            }
            else
            {
                settings = new CameraSettingsDto
                {
                    SelectedAeMode         = SDKData.Enums.AEMode.Manual,
                    SelectedAvValue        = SDKData.Enums.ApertureValue.AV_8,
                    SelectedIsoSensitivity = SDKData.Enums.CameraISOSensitivity.ISO_400,
                    SelectedWhiteBalance   = SDKData.Enums.WhiteBalance.Daylight,
                    SelectedShutterSpeed   = SDKData.Enums.ShutterSpeed.TV_200,
                };
                using (var fs = File.Open("CameraPhotoSettings.xml", FileMode.OpenOrCreate))
                {
                    new XmlSerializer(typeof(CameraSettingsDto)).Serialize(fs, settings);
                }
            }
            return(settings);
        }
        public override void Initialize()
        {
            _imageProcessor.TimerElapsed       += ImageProcessorOnTimerElapsed;
            _imageProcessor.CameraErrorEvent   += ImageProcessorOnCameraErrorEvent;
            _imageProcessor.ImageChanged       += ImageProcessorOnStreamChanged;
            _imageProcessor.ImageNumberChanged += ImageProcessorOnImageNumberChanged;


            _imageProcessor.InitializeProcessor();
            OpenSession();
            if (!_sessionOpened)
            {
                return;
            }

            _settings = _settingsProvider.GetCameraSettings();

            if (_settings != null)
            {
                _imageProcessor.SetSetting((uint)PropertyId.AEMode, (uint)_settings.SelectedAeMode);
                _imageProcessor.SetSetting((uint)PropertyId.WhiteBalance, (uint)_settings.SelectedWhiteBalance);
                _imageProcessor.SetSetting((uint)PropertyId.Av, (uint)_settings.SelectedAvValue);
                _imageProcessor.SetSetting((uint)PropertyId.ExposureCompensation, (uint)_settings.SelectedCompensation);
                _imageProcessor.SetSetting((uint)PropertyId.ISOSpeed, (uint)_settings.SelectedIsoSensitivity);
                _imageProcessor.SetSetting((uint)PropertyId.Tv, (uint)_settings.SelectedShutterSpeed);
            }
            _cameraStreamSynchronize = new AutoResetEvent(false);
            StartLiveView();
        }
        public CameraSettingsDto GetCameraSettings()
        {
            CameraSettingsDto settings = null;

            if (!File.Exists("CameraPhotoSettings.xml"))
            {
                settings = new CameraSettingsDto
                {
                    SelectedAeMode         = SDKData.Enums.AEMode.Manual,
                    SelectedAvValue        = SDKData.Enums.ApertureValue.AV_8,
                    SelectedIsoSensitivity = SDKData.Enums.CameraISOSensitivity.ISO_400,
                    SelectedWhiteBalance   = SDKData.Enums.WhiteBalance.Daylight,
                    SelectedShutterSpeed   = SDKData.Enums.ShutterSpeed.TV_200,
                    SelectedCompensation   = SDKData.Enums.ExposureCompensation.Zero
                };
                using (var file = File.Create("CameraPhotoSettings.xml"))
                {
                    new XmlSerializer(settings.GetType()).Serialize(file, settings);
                    file.Close();
                }
            }
            else
            {
                using (var file = File.OpenRead("CameraPhotoSettings.xml"))
                {
                    settings = (CameraSettingsDto) new XmlSerializer(typeof(CameraSettingsDto)).Deserialize(file);
                    file.Close();
                }
            }
            return(settings);
        }
        public override void Initialize()
        {
            _logger.Trace("Инициализация");
            _imageProcessor.TimerElapsed       += ImageProcessorOnTimerElapsed;
            _imageProcessor.CameraErrorEvent   += ImageProcessorOnCameraErrorEvent;
            _imageProcessor.ImageChanged       += ImageProcessorOnStreamChanged;
            _imageProcessor.ImageNumberChanged += ImageProcessorOnImageNumberChanged;

            Capturing = false;

            _imageProcessor.InitializeProcessor();
            OpenSession();
            if (!_sessionOpened)
            {
                _dialogService.ShowInfo("Камера не готова, попробуйте ещё раз.");
                _logger.Trace("Неудачная поптыка открытия сессии");
                return;
            }

            _settings = _settingsProvider.GetCameraSettings();

            if (_settings != null)
            {
                _logger.Trace("Применение настроек для камеры");

                //_imageProcessor.SetSetting((uint)PropertyId.AEMode, (uint)_settings.SelectedAeMode); TODO Не поддерживается.
                _imageProcessor.SetSetting((uint)PropertyId.WhiteBalance, (uint)_settings.SelectedWhiteBalance);
                _imageProcessor.SetSetting((uint)PropertyId.Av, (uint)_settings.SelectedAvValue);
                _imageProcessor.SetSetting((uint)PropertyId.ExposureCompensation, (uint)_settings.SelectedCompensation);
                _imageProcessor.SetSetting((uint)PropertyId.ISOSpeed, (uint)_settings.SelectedIsoSensitivity);
                _imageProcessor.SetSetting((uint)PropertyId.Tv, (uint)_settings.SelectedShutterSpeed);
            }
            _cameraStreamSynchronize = new AutoResetEvent(false);
            _logger.Trace("Запуск LiveView");
            StartLiveView();
            var cancellTokenSource = new CancellationTokenSource();

            if (TakePictureCommand.CanExecute(cancellTokenSource.Token))
            {
                try
                {
                    TakePictureCommand.Execute(cancellTokenSource.Token);
                }
                catch (Exception ex)
                {
                    //_dialogService.ShowInfo("Упс... С камерой возникли неполадки. Приносим свои извинения. =(");
                    _logger.Error(ex, "Ошибка при инициализации камеры");
                    GoBack();
                }
            }
            else
            {
                //_dialogService.ShowInfo("Упс... С камерой возникли неполадки. Приносим свои извинения. =(");
                _logger.Trace("TakePictureCommand.CanExecute вернул false");
                GoBack();
            }
        }
        //protected async Task<byte[]> TakePictureInternal(Size liveViewImageStreamSize, CameraSettingsDto settings, CancellationToken token)
        //{
        //    return await Task.Run(() => Run(liveViewImageStreamSize, settings, token), token);
        //}

        private async Task <byte[]> Run(Size liveViewImageStreamSize, CameraSettingsDto settings, CancellationToken token)
        {
            var pictures = new List <byte[]>();

            for (var i = 0; i < _pattern.Images.Count; i++)
            {
                _logger.Trace($"Фото №{i}");

                token.ThrowIfCancellationRequested();
                RaiseImageNumberChanged(i + 1);

                await Task.Delay(TimeSpan.FromSeconds(1), token);

                CommandManager.InvalidateRequerySuggested();

                for (var j = 5; j >= 0; j--)
                {
                    var j1 = j;
                    RaiseTimerElapsed(j1);
                    await Task.Delay(TimeSpan.FromSeconds(1), token);
                }
                _logger.Trace("Отсчёт закончен. Начало применения настроек для камеры.");


                SetCameraSettings(settings.SelectedPhotoAeMode, settings.SelectedPhotoWhiteBalance,
                                  settings.SelectedPhotoAvValue, settings.SelectedPhotoIsoSensitivity,
                                  settings.SelectedPhotoShutterSpeed);
                _logger.Trace("Настройки для камеры применены.");

                //await Task.Delay(TimeSpan.FromSeconds(1));

                //RaiseImageNumberChanged(i + 1);
                //await Task.Delay(TimeSpan.FromSeconds(1), token);
                token.ThrowIfCancellationRequested();
                byte[] picture = await _imageProcessor.DoTakePictureAsync();

                pictures.Add(picture);

                token.ThrowIfCancellationRequested();
                //await Task.Delay(TimeSpan.FromSeconds(3), token); //todo
                _logger.Trace("Фотография сделана. Начало применения настроек для LiveView");

                SetCameraSettings(settings.SelectedAeMode, settings.SelectedWhiteBalance,
                                  settings.SelectedAvValue, settings.SelectedIsoSensitivity,
                                  settings.SelectedShutterSpeed);
                _logger.Trace("Настройки для камеры применены.");

                _logger.Trace("Стоп LiveView.");
                StopLiveView();
                _logger.Trace("Старт LiveView.");
                StartLiveView();
            }

            byte[] result = _imageUtils.ProcessImages(pictures, liveViewImageStreamSize, _pattern);
            return(result);
        }
 private void StartLiveView()
 {
     _imageProcessor.StartLiveView();
     _settings = _settingsProvider.GetCameraSettings();
     if (_settings != null)
     {
         _imageProcessor.SetSetting((uint)PropertyId.WhiteBalance, (uint)_settings.SelectedWhiteBalance);
         _imageProcessor.SetSetting((uint)PropertyId.Av, (uint)_settings.SelectedAvValue);
         _imageProcessor.SetSetting((uint)PropertyId.ExposureCompensation, (uint)_settings.SelectedCompensation);
         _imageProcessor.SetSetting((uint)PropertyId.ISOSpeed, (uint)_settings.SelectedIsoSensitivity);
         _imageProcessor.SetSetting((uint)PropertyId.Tv, (uint)_settings.SelectedShutterSpeed);
     }
     _isLiveViewOn = true;
 }
        public async Task <byte[]> TakeTestPictureAsync(byte[] liveViewImageStream, CameraSettingsDto settings)
        {
            SetCameraSettings(settings.SelectedAeMode, settings.SelectedPhotoWhiteBalance,
                              settings.SelectedPhotoAvValue, settings.SelectedPhotoIsoSensitivity,
                              settings.SelectedPhotoShutterSpeed);
            byte[] picture = await _imageProcessor.DoTakePictureAsync();

            //byte[] picture = await Task.Run(async () =>
            //{
            //    //    await Task.Delay(500);//TODO Костыль, не понятно почему, но камере реально необходимо время, что бы свойства установились
            //    var res = await _imageProcessor.DoTakePictureAsync();
            //    return res;
            //});
            StopLiveView();
            return(picture);
        }
 public virtual async Task <CompositionProcessingResult> TakePictureAsync(Size liveViewImageStreamSize, CameraSettingsDto settings,
                                                                          CancellationToken token)
 {
     return(new CompositionProcessingResult(_pattern, await Run(liveViewImageStreamSize, settings, token)));
 }
 public virtual void SaveCameraSettings(CameraSettingsDto settings)
 {
     _user.Value.CameraSettings = settings.Serialize();
     _userRepository.UpdateUser(_user.Value);
     _userRepository.Commit();
 }