using System; using System.Collections.Generic; using System.Threading; using ClumsyCore.Pilot; namespace MultiWheelC { public class Sleep : MovementDefinition { public float Second = 2f; public override IEnumerable Get() { if (Second <= 0) { yield return false; yield break; } var endTime = DateTime.UtcNow.AddSeconds(Second); while (DateTime.UtcNow < endTime) { Thread.Sleep(50); yield return true; } yield return false; } } public class DriverAble : MovementDefinition { public int WaitTimeoutMs = 2000; public int PollIntervalMs = 50; // C层单车硬件:请求全部驱动轮复位并恢复使能。 public override IEnumerable Get() { PilotDefinition.Self.ResetFromC = true; try { var start = DateTime.Now; var timeoutMs = Math.Max(0, WaitTimeoutMs); var pollMs = Math.Max(1, PollIntervalMs); // 至少保留一个调度周期,确保M层能收到复位请求。 yield return true; while (!PilotDefinition.Self.WheelAbleState && (DateTime.Now - start).TotalMilliseconds < timeoutMs) { Thread.Sleep(pollMs); yield return true; } } finally { PilotDefinition.Self.ResetFromC = false; } } } public class DriverDisable : MovementDefinition { public int WaitTimeoutMs = 3000; public int PollIntervalMs = 20; // C层单车硬件:请求驱动轮退出使能,并等待M层状态反馈。 public override IEnumerable Get() { var timeoutMs = Math.Max(0, WaitTimeoutMs); var pollMs = Math.Max(1, PollIntervalMs); var startTime = DateTime.UtcNow; var success = false; PilotDefinition.Self.DisableFromC = true; try { // 至少保持一个C层调度周期,确保M层能收到下使能请求。 yield return true; success = !PilotDefinition.Self.WheelAbleState; while (!success && (DateTime.UtcNow - startTime).TotalMilliseconds < timeoutMs) { Thread.Sleep(pollMs); success = !PilotDefinition.Self.WheelAbleState; if (!success) { yield return true; } } } finally { // 无论正常完成、超时、异常还是任务被停止,都撤销请求。 PilotDefinition.Self.DisableFromC = false; } if (success) { Console.WriteLine( $"驱动器下使能完成," + $"WheelAbleState=" + $"{PilotDefinition.Self.WheelAbleState}"); } else { Console.WriteLine( $"驱动器下使能超时," + $"WheelAbleState=" + $"{PilotDefinition.Self.WheelAbleState}," + $"等待{timeoutMs}ms"); } yield return false; } } }