Просмотр исходного кода

feat(d2-02-t3): FocusRangeResolver范围就近优先解析+5单测(TDD,对齐引擎默认2000/6000)

huangjie 2 дней назад
Родитель
Сommit
1362ca7141

+ 61 - 0
ivf_tl_operate_2.0/control/IvfTl.AutoFocus.Tests/FocusRangeResolverTests.cs

@@ -0,0 +1,61 @@
+using Xunit;
+using IvfTl.AutoFocus.Layout;
+
+namespace IvfTl.AutoFocus.Tests
+{
+    public class FocusRangeResolverTests
+    {
+        private static FocusRangeRawConfig Raw(
+            int? wellH = null, int? wellV = null,
+            int? devH = null, int? devV = null,
+            int expMin = 10, int expMax = 800,
+            int hCenter = 71000, int vCenter = 88000) =>
+            new FocusRangeRawConfig
+            {
+                WellHRange = wellH, WellVRange = wellV,
+                DeviceHRange = devH, DeviceVRange = devV,
+                ExposureMin = expMin, ExposureMax = expMax,
+                HorizontalCenter = hCenter, VerticalCenter = vCenter,
+            };
+
+        [Fact]
+        public void 半幅_well级覆盖设备级()
+        {
+            var r = FocusRangeResolver.Resolve(Raw(wellH: 1500, wellV: 4000, devH: 2000, devV: 6000));
+            Assert.Equal(1500, r.HHalf);
+            Assert.Equal(4000, r.VHalf);
+        }
+
+        [Fact]
+        public void 半幅_well空则继承设备级()
+        {
+            var r = FocusRangeResolver.Resolve(Raw(wellH: null, wellV: null, devH: 2000, devV: 6000));
+            Assert.Equal(2000, r.HHalf);
+            Assert.Equal(6000, r.VHalf);
+        }
+
+        [Fact]
+        public void 半幅_两级皆空则回退引擎默认()
+        {
+            var r = FocusRangeResolver.Resolve(Raw(wellH: null, wellV: null, devH: null, devV: null));
+            Assert.Equal(FocusRangeResolver.DefaultHHalf, r.HHalf);
+            Assert.Equal(FocusRangeResolver.DefaultVHalf, r.VHalf);
+        }
+
+        [Fact]
+        public void 曝光范围_透传设备级()
+        {
+            var r = FocusRangeResolver.Resolve(Raw(expMin: 15, expMax: 600));
+            Assert.Equal(15, r.ExpLo);
+            Assert.Equal(600, r.ExpHi);
+        }
+
+        [Fact]
+        public void 中心_原样透传()
+        {
+            var r = FocusRangeResolver.Resolve(Raw(hCenter: 71000, vCenter: 88000));
+            Assert.Equal(71000, r.HCenter);
+            Assert.Equal(88000, r.VCenter);
+        }
+    }
+}

+ 36 - 0
ivf_tl_operate_2.0/control/IvfTl.AutoFocus/Layout/FocusRangeResolver.cs

@@ -0,0 +1,36 @@
+namespace IvfTl.AutoFocus.Layout
+{
+    /// <summary>对焦范围就近优先解析:well级半幅 &gt; 设备级默认 &gt; 引擎硬编码默认。纯逻辑,仿 PhotoLayerCalculator。</summary>
+    public class FocusRangeRawConfig
+    {
+        public int? WellHRange, WellVRange, DeviceHRange, DeviceVRange;
+        public int ExposureMin, ExposureMax;
+        public int HorizontalCenter, VerticalCenter;
+    }
+
+    public class FocusRangeConfig
+    {
+        public int HHalf, VHalf, ExpLo, ExpHi, HCenter, VCenter;
+    }
+
+    public static class FocusRangeResolver
+    {
+        // 与 CalibrationEngine 现有硬编码默认对齐(HFineRange=2000、FineZHalf=6000)。
+        public const int DefaultHHalf = 2000;
+        public const int DefaultVHalf = 6000;
+
+        public static FocusRangeConfig Resolve(FocusRangeRawConfig raw)
+        {
+            if (raw == null) throw new System.ArgumentNullException(nameof(raw));
+            return new FocusRangeConfig
+            {
+                HHalf = raw.WellHRange ?? raw.DeviceHRange ?? DefaultHHalf,
+                VHalf = raw.WellVRange ?? raw.DeviceVRange ?? DefaultVHalf,
+                ExpLo = raw.ExposureMin,
+                ExpHi = raw.ExposureMax,
+                HCenter = raw.HorizontalCenter,
+                VCenter = raw.VerticalCenter,
+            };
+        }
+    }
+}