UnityPlatformWindowsPhone.Internals.ScannerAutoFocus.DriveAutoFocusAsync C# (CSharp) Method

DriveAutoFocusAsync() private method

private DriveAutoFocusAsync ( ) : System.Threading.Tasks.Task
return System.Threading.Tasks.Task
        async Task DriveAutoFocusAsync()
        {
            while (true)
            {
                FocusControl control;
                bool runFocusSweep;
                lock (this)
                {
                    if (_mFocusControl == null)
                    {
                        return;
                    }
                    control = _mFocusControl;
                    runFocusSweep = _mTimeSinceLastBarcode.ElapsedMilliseconds > 1000;
                }

                if (runFocusSweep)
                {
                    try
                    {
                        await control.FocusAsync();
                    }
                    catch
                    {
                        // Failing to focus is ok (happens when preview lacks texture)
                    }
                }

                await Task.Delay(1000);
            }
        }
    }

Usage Example

        public static async Task<ScannerAutoFocus> StartAsync(FocusControl control)
        {
            var autoFocus = new ScannerAutoFocus(control);

            AutoFocusRange range;
            if (control.SupportedFocusRanges.Contains(AutoFocusRange.FullRange))
            {
                range = AutoFocusRange.FullRange;
            }
            else if (control.SupportedFocusRanges.Contains(AutoFocusRange.Normal))
            {
                range = AutoFocusRange.Normal;
            }
            else
            {
                // Auto-focus disabled
                return autoFocus;
            }

            FocusMode mode;
            if (control.SupportedFocusModes.Contains(FocusMode.Continuous))
            {
                mode = FocusMode.Continuous;
            }
            else if (control.SupportedFocusModes.Contains(FocusMode.Single))
            {
                mode = FocusMode.Single;
            }
            else
            {
                // Auto-focus disabled
                return autoFocus;
            }

            if (mode == FocusMode.Continuous)
            {
                // True continuous auto-focus
                var settings = new FocusSettings()
                {
                    AutoFocusRange = range,
                    Mode = mode,
                    WaitForFocus = false,
                    DisableDriverFallback = false
                };
                control.Configure(settings);
                await control.FocusAsync();
            }
            else
            {
                // Simulated continuous auto-focus
                var settings = new FocusSettings()
                {
                    AutoFocusRange = range,
                    Mode = mode,
                    WaitForFocus = true,
                    DisableDriverFallback = false
                };
                control.Configure(settings);

                var ignore = Task.Run(async () => { await autoFocus.DriveAutoFocusAsync(); });
            }

            return autoFocus;
        }