Repository navigation
Expand file tree
/
Copy pathCameraControlUi.cs
More file actions
119 lines (103 loc) · 5 KB
/
Copy pathCameraControlUi.cs
File metadata and controls
119 lines (103 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System.Globalization;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Layout;
using static Scopie.ExceptionReporter;
using static Scopie.Ext;
namespace Scopie;
internal sealed class CameraControlUi(ICamera camera)
{
private readonly StackPanel _controlsStackPanel = new();
private List<CameraControlValue> _cameraControls = [];
public static async Task<StackPanel> Create(ICamera camera, ImageProcessor imageProcessor, CroppableImage croppableImage)
{
var self = new CameraControlUi(camera);
var (chipWidth, chipHeight, imageWidth, imageHeight, pixelWidth, pixelHeight, bitsPerPixel) = await camera.GetChipInfoAsync();
var (effectiveStartX, effectiveStartY, effectiveSizeX, effectiveSizeY) = await camera.GetEffectiveAreaAsync();
var stackPanel = new StackPanel();
stackPanel.Children.Add(new TextBlock { Text = camera.CameraId.Id });
stackPanel.Children.Add(new TextBlock { Text = $"sdk version: {await camera.GetSdkVersionAsync()}" });
stackPanel.Children.Add(new TextBlock { Text = $"firmware version: {await camera.GetFirmwareVersionAsync()}" });
stackPanel.Children.Add(new TextBlock { Text = $"fpga version: {await camera.GetFpgaVersionAsync()}" });
stackPanel.Children.Add(new TextBlock { Text = $"chip size: {chipWidth} - {chipHeight}" });
stackPanel.Children.Add(new TextBlock { Text = $"image size: {imageWidth} - {imageHeight}" });
stackPanel.Children.Add(new TextBlock { Text = $"pixel size: {pixelWidth} - {pixelHeight}" });
stackPanel.Children.Add(new TextBlock { Text = $"bits/pixel: {bitsPerPixel}" });
stackPanel.Children.Add(new TextBlock { Text = $"effective area: x={effectiveStartX} y={effectiveStartY} w={effectiveSizeX} h={effectiveSizeY}" });
stackPanel.Children.Add(new TextBlock { Text = await camera.GetFastReadoutStatusAsync() });
stackPanel.Children.Add(Toggle("Exposing", v => camera.Exposing = v));
if (camera is DebugCamera debugCamera)
{
stackPanel.Children.Add(Button("Debug expose", () => debugCamera.Push(1)));
stackPanel.Children.Add(Button("Debug 100 expose", () => debugCamera.Push(100)));
}
// TODO: Save folder
stackPanel.Children.Add(Toggle("Save", self.SetSave));
stackPanel.Children.Add(Toggle("Sort stretch", v => imageProcessor.SortStretch = v));
stackPanel.Children.Add(Button("Reset crop", () =>
{
croppableImage.ResetCrop();
Try(camera.ResetHardwareCrop());
}));
stackPanel.Children.Add(Button("Hardware crop", () => Try(camera.HardwareCrop(croppableImage.CurrentCrop))));
stackPanel.AttachedToLogicalTree += (_, _) => camera.OnControlsUpdated += self.OnControlsUpdated;
stackPanel.DetachedFromLogicalTree += (_, _) => camera.OnControlsUpdated -= self.OnControlsUpdated;
_ = new Platesolver(stackPanel, () => camera.Current);
stackPanel.Children.Add(self._controlsStackPanel);
return stackPanel;
}
private void OnControlsUpdated(List<CameraControlValue> obj)
{
_cameraControls = obj;
UpdateControls();
}
private void UpdateControls()
{
if (_controlsStackPanel.Children.Count > _cameraControls.Count)
_controlsStackPanel.Children.RemoveRange(_cameraControls.Count, _controlsStackPanel.Children.Count - _cameraControls.Count);
while (_controlsStackPanel.Children.Count < _cameraControls.Count)
{
var index = _controlsStackPanel.Children.Count;
var horiz = new StackPanel { Orientation = Orientation.Horizontal };
horiz.Children.Add(new TextBlock());
var textBox = new TextBox();
textBox.KeyDown += (_, args) =>
{
if (textBox.IsFocused && args.Key == Key.Enter && TrySetControl(index, textBox.Text))
textBox.Text = "";
};
horiz.Children.Add(textBox);
_controlsStackPanel.Children.Add(horiz);
}
for (var i = 0; i < _cameraControls.Count; i++)
{
var horiz = (StackPanel)_controlsStackPanel.Children[i];
var label = (TextBlock)horiz.Children[0];
label.Text = _cameraControls[i].ToString();
}
}
private bool TrySetControl(int controlIndex, string? text)
{
if (!double.TryParse(text, CultureInfo.InvariantCulture, out var v))
return false;
if (controlIndex >= _cameraControls.Count)
return false;
var c = _cameraControls[controlIndex];
camera.SetControl(c.CameraControl, v);
return true;
}
private void SetSave(bool value)
{
camera.MoveNext -= OnCameraImage;
if (value)
{
camera.MoveNext += OnCameraImage;
if (camera.Current is { } current)
OnCameraImage(current);
}
}
private void OnCameraImage(DeviceImage image)
{
Try(Task.Run(() => ImageIO.Save(image)));
}
}