diff --git a/GSS2.Core/Hardware/CameraService.cs b/GSS2.Core/Hardware/CameraService.cs index 2638517..7fb7989 100644 --- a/GSS2.Core/Hardware/CameraService.cs +++ b/GSS2.Core/Hardware/CameraService.cs @@ -79,6 +79,8 @@ public class CameraService : IDisposable private List? _imageCaptureMappedBuffers; private readonly CancellationTokenSource _disposeCts = new CancellationTokenSource(); + public bool IsImageCapturing { get; private set; } = false; + public CameraService(ILogger logger, CameraServiceConfiguration? configuration = null, bool autoInitialize = false) { _logger = logger; @@ -488,6 +490,8 @@ public class CameraService : IDisposable .CreateLinkedTokenSource(_disposeCts.Token, cancellationToken) .Token; + IsImageCapturing = true; + _logger.LogDebug("Capturing {} frame(s)", framesCount); OpenCvSharp.Mat? image = null; @@ -501,8 +505,6 @@ public class CameraService : IDisposable { effectiveCancellationToken.ThrowIfCancellationRequested(); _logger.LogDebug("Requested {} frame(s), now collected {}", framesCount, planesData.Count()); - if (File.Exists("/proc/self/status")) - _logger.LogDebug("Current RAM Usage: {}", File.ReadAllLines("/proc/self/status").FirstOrDefault(l => l.StartsWith("RssAnon:"))?.Substring("RssAnon:".Length)?.Trim() ?? "UNKNOWN"); var oldPlanesDataCount = planesData.Count(); @@ -521,7 +523,7 @@ public class CameraService : IDisposable throw new Exception("Error while request create"); requests.Add(request); } - _logger.LogDebug("Request(s) created"); + _logger.LogDebug("{} request(s) created", requests.Count()); effectiveCancellationToken.ThrowIfCancellationRequested(); @@ -578,6 +580,8 @@ public class CameraService : IDisposable planesData.Add(planeData); } + _logger.LogDebug("Planes data added"); + if (planesData.Count() - oldPlanesDataCount == requests.Count()) cts.SetResult(); } @@ -592,8 +596,9 @@ public class CameraService : IDisposable throw new Exception("Error while request queue"); } } - _logger.LogDebug("Request(s) queued"); + _logger.LogDebug("{} request(s) queued", requests.Count()); await cts.Task.WaitAsync(effectiveCancellationToken); + _logger.LogDebug("{} request(s) compilted", requests.Count()); _camera.RequestCompleted -= RequestCompleted; foreach (var key in fdsData.Keys) @@ -604,9 +609,6 @@ public class CameraService : IDisposable } _logger.LogDebug("Frame(s) collected"); - if (File.Exists("/proc/self/status")) - _logger.LogDebug("Current RAM Usage: {}", File.ReadAllLines("/proc/self/status").FirstOrDefault(l => l.StartsWith("RssAnon:"))?.Substring("RssAnon:".Length)?.Trim() ?? "UNKNOWN"); - effectiveCancellationToken.ThrowIfCancellationRequested(); @@ -657,6 +659,8 @@ public class CameraService : IDisposable #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. planesData.Clear(); } + + IsImageCapturing = false; return image; } @@ -707,6 +711,9 @@ public class CameraService : IDisposable void TimerElapsed(object? sender, System.Timers.ElapsedEventArgs ea) { + if (IsImageCapturing) + return; + try { FrameBuffer buffer; @@ -766,6 +773,9 @@ public class CameraService : IDisposable } public (FrameBuffer, StreamConfiguration)? GrabViewFinderFrame() { + if (IsImageCapturing) + return null; + FrameBuffer? buffer = null; lock (ViewFinderBufferQueue) if (ViewFinderBufferQueue.Count() > 0) diff --git a/GSS2.Test/ViewModels/MainViewModel.cs b/GSS2.Test/ViewModels/MainViewModel.cs index 6ace3be..afab441 100644 --- a/GSS2.Test/ViewModels/MainViewModel.cs +++ b/GSS2.Test/ViewModels/MainViewModel.cs @@ -23,7 +23,7 @@ public partial class MainViewModel : ViewModelBase ResourcesViewModel = resourcesViewModel; ButtonClick = new RelayCommand(() => { - cameraService.CaptureImage(CancellationToken.None, 10).ContinueWith(image => Image = image.Result); + Task.Run(() => cameraService.CaptureImage(CancellationToken.None, 10).ContinueWith(image => Image = image.Result)); }); _logger.LogInformation("{} initialized", nameof(MainViewModel)); diff --git a/GSS2.Test/Views/MainView.axaml b/GSS2.Test/Views/MainView.axaml index 3dc275f..6256e2f 100644 --- a/GSS2.Test/Views/MainView.axaml +++ b/GSS2.Test/Views/MainView.axaml @@ -6,10 +6,12 @@ xmlns:core="using:GSS2.UI.Core" x:DataType="local_vm:MainViewModel" x:Class="GSS2.Test.Views.MainView"> - - -