using System; using ClumsyCore; using ClumsyCore.Pilot; using FundamentalLib; using MDCSToolBox.Clumsy.Movements; using MDCSToolBox.Clumsy.Pilot; namespace MultiWheelC { public abstract class ClampMovementTestBase : MovementTest { public float TimeoutSeconds = 30f; // 动作超时时间,单位s。 private DriveTask _task; protected abstract bool Close { get; } // 根据派生测试类型驱动左右夹臂同步夹紧或打开。 public override void Test() { var leftTarget = Close ? PilotDefinition.Self.LeftArmUpperPos : PilotDefinition.Self.LeftArmLowerPos; var rightTarget = Close ? PilotDefinition.Self.RightArmUpperPos : PilotDefinition.Self.RightArmLowerPos; if (float.IsNaN(leftTarget) || float.IsInfinity(leftTarget) || float.IsNaN(rightTarget) || float.IsInfinity(rightTarget)) { Console.WriteLine( "夹臂目标位置无效,取消夹臂运动测试。"); return; } // 防止重复点击时上一项夹臂任务仍在运行。 TestStop(); Console.WriteLine( $"开始夹臂{(Close ? "夹紧" : "打开")}测试:" + $"左目标={leftTarget},右目标={rightTarget}"); var task = new DriveTask( new ClampToTarget { LeftClampTarget = leftTarget, RightClampTarget = rightTarget, TimeoutSeconds = TimeoutSeconds }.Get()); _task = task; try { task.Wait(); } finally { PilotDefinition.Self.SpeedLeftArm = 0f; PilotDefinition.Self.SpeedRightArm = 0f; if (ReferenceEquals(_task, task)) _task = null; } } // 停止夹臂任务并立即清零左右夹臂下发速度。 public override void TestStop() { _task?.Stop(); _task = null; PilotDefinition.Self.SpeedLeftArm = 0f; PilotDefinition.Self.SpeedRightArm = 0f; } } [MovementTest(name = "夹臂关闭测试")] public sealed class TestClampCloseMovement : ClampMovementTestBase { protected override bool Close => false; } [MovementTest(name = "夹臂启动测试")] public sealed class TestClampOpenMovement : ClampMovementTestBase { protected override bool Close => true; } }