using System;
using System.Globalization;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using TeamAAS.Robot.Interfaces;
namespace TeamAAS.Robot.UI
{
///
/// 默认机器人调试页:状态/坐标 + 电机/重置/刹车 + 步进/Tool + Jog 六向。
/// 未在 [Robot] 特性指定 DebugPageType 的品牌机器人均用本页。
/// 照 MotionDebugView 范式:code-behind 直接操作 BindRobot 得到的 IRobot 实例。
///
public partial class DefaultRobotDebugPage : UserControl, IRobotDebugPage
{
private IRobot _robot;
private readonly System.Windows.Threading.DispatcherTimer _statusTimer;
public DefaultRobotDebugPage()
{
InitializeComponent();
_statusTimer = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromMilliseconds(500) };
_statusTimer.Tick += (s, e) => RefreshStatus();
}
public void BindRobot(IRobot robot)
{
_robot = robot;
OpsRoot.IsEnabled = robot != null;
if (robot != null)
{
_statusTimer.Start();
RefreshStatus();
var _t = GetPosAsync();
}
else
{
_statusTimer.Stop();
}
}
public void UnbindRobot()
{
_statusTimer.Stop();
_robot = null;
OpsRoot.IsEnabled = false;
TxtStatus.Text = "";
TxtMessage.Text = "";
TxtPos.Text = "X: --- Y: --- Z: ---";
}
private void RefreshStatus()
{
if (_robot == null) { TxtStatus.Text = ""; return; }
try { TxtStatus.Text = _robot.IsConnected ? "已连接" : "未连接"; }
catch { }
}
private double Step
{
get { double s; return double.TryParse(TxtStep.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out s) ? s : 1.0; }
}
private int ToolIndex { get { return ToolCombo.SelectedIndex < 0 ? 0 : ToolCombo.SelectedIndex; } }
private void Msg(string m) { TxtMessage.Text = m; }
private async void BtnMotorOn_Click(object sender, RoutedEventArgs e) { await RunAsync(() => _robot.MotorAsync(true), "电机已开启", "电机操作"); }
private async void BtnMotorOff_Click(object sender, RoutedEventArgs e) { await RunAsync(() => _robot.MotorAsync(false), "电机已关闭", "电机操作"); }
private async void BtnReset_Click(object sender, RoutedEventArgs e) { await RunAsync(() => _robot.ResetAsync(), "已重置", "重置"); }
private async void BtnSFree_Click(object sender, RoutedEventArgs e) { await RunAsync(() => _robot.SFreeAsync(), "已释放刹车", "释放刹车"); }
private async void BtnSLock_Click(object sender, RoutedEventArgs e) { await RunAsync(() => _robot.SLockAsync(), "已锁定刹车", "锁定刹车"); }
private async void BtnGetPos_Click(object sender, RoutedEventArgs e) { await GetPosAsync(); }
private async void BtnSelectTool_Click(object sender, RoutedEventArgs e)
{
int t = ToolIndex;
await RunAsync(() => _robot.SelectToolAsync(t), "已选择 Tool " + t, "选择Tool");
}
private async void BtnJog_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
var param = btn == null ? null : btn.Tag as string;
if (_robot == null || string.IsNullOrEmpty(param) || param.Length < 2) return;
string axis = param.Substring(0, 1);
string dir = param.Substring(1, 1);
double dist = Step * (dir == "+" ? 1 : -1);
await RunAsync(() => _robot.JogAsync(axis, dist), "Jog " + param + " " + Step + "mm", "Jog");
await GetPosAsync();
}
private async Task RunAsync(Func> op, string okMsg, string errLabel)
{
if (_robot == null) return;
try { await op(); Msg(okMsg); }
catch (Exception ex) { Msg(errLabel + "异常: " + ex.Message); }
}
private async Task GetPosAsync()
{
if (_robot == null) return;
try
{
var pos = await _robot.GetRobotPosAsync();
if (pos != null)
TxtPos.Text = string.Format("X: {0:F3} Y: {1:F3} Z: {2:F3}\nU: {3:F3} V: {4:F3} W: {5:F3}",
pos.X, pos.Y, pos.Z, pos.U, pos.V, pos.W);
}
catch (Exception ex) { Msg("读取位置异常: " + ex.Message); }
}
}
}