using System; using System.Threading.Tasks; using System.Windows; using System.Windows.Media; namespace AutoFocusTool { // 电机控制:Z对焦轴 / 水平轴 / 位置刷新 public partial class MainWindow { /// 串口操作统一包装:置忙、后台执行、完成后刷新位置。 private void MotorAction(string name, Func action) { if (_motor == null) return; if (_busy) { Log("串口忙,请稍候。"); return; } int motorDelay = ParseInt2(TxtMotorDelay.Text, 1500); // UI线程先读 Task.Run(() => { _busy = true; try { if (_motor != null) _motor.MotorDelayMs = motorDelay; bool ok = action(); Log($"{name} {(ok ? "完成" : "失败")}"); } catch (Exception ex) { Log($"{name} 异常: {ex.Message}"); } finally { _busy = false; } RefreshPositions(); }); } // ── Z 对焦轴 ── private void BtnZUp_Click(object sender, RoutedEventArgs e) { int step = ParseInt2(TxtZStep.Text, 128); LogAction($"点击 Z正转, 步距={step}"); MotorAction($"Z正转 {step}步", () => _motor.VerticalForward(step)); } private void BtnZDown_Click(object sender, RoutedEventArgs e) { int step = ParseInt2(TxtZStep.Text, 128); LogAction($"点击 Z反转, 步距={step}"); MotorAction($"Z反转 {step}步", () => _motor.VerticalBackward(step)); } private void BtnZReset_Click(object sender, RoutedEventArgs e) { LogAction("点击 Z复位"); MotorAction("Z复位", () => _motor.VerticalReset()); } private void BtnZMoveTo_Click(object sender, RoutedEventArgs e) { int abs = ParseInt2(TxtZAbs.Text, 0); LogAction($"点击 Z绝对移动, 目标={abs}"); MotorAction($"Z绝对移动→{abs}", () => _motor.VerticalMoveTo(abs)); } // ── 水平轴 ── private void BtnHFwd_Click(object sender, RoutedEventArgs e) { int step = ParseInt2(TxtHStep.Text, 100); LogAction($"点击 水平正转, 步距={step}"); MotorAction($"水平正转 {step}步", () => _motor.HorizontalForward(step)); } private void BtnHBwd_Click(object sender, RoutedEventArgs e) { int step = ParseInt2(TxtHStep.Text, 100); LogAction($"点击 水平反转, 步距={step}"); MotorAction($"水平反转 {step}步", () => _motor.HorizontalBackward(step)); } private void BtnHReset_Click(object sender, RoutedEventArgs e) { LogAction("点击 水平复位"); MotorAction("水平复位", () => _motor.HorizontalReset()); } // ── 读位置并显示 ── private void RefreshPositions() { if (_motor == null) return; Task.Run(() => { if (_busy) return; _busy = true; int z = -1, hpos = -1; try { z = _motor.ReadVerticalPosition(); hpos = _motor.ReadHorizontalPosition(); } catch (Exception ex) { Log($"读位置异常: {ex.Message}"); } finally { _busy = false; } _lastZ = z; _lastH = hpos; Dispatcher.Invoke(() => { TxtZ.Text = $"Z: {z} 水平: {hpos}"; UpdateParamDisplay(); }); }); } private static int ParseInt2(string s, int def) => int.TryParse(s?.Trim(), out int v) ? v : def; } }