2using System.Diagnostics;
4using System.Threading.Tasks;
19 internal static class LineTiming
25 private const int BitsPerCharacter = 10;
30 private const int IdleCharacters = 2;
38 private const double SpinThresholdMilliseconds = 16;
48 public static TimeSpan ForCharacters(
int baudRate,
int characterCount) =>
49 baudRate <= 0 || characterCount <= 0
51 : TimeSpan.FromSeconds((
double)(characterCount * BitsPerCharacter) / baudRate);
62 public static TimeSpan IdleLine(
int baudRate) => ForCharacters(baudRate, IdleCharacters);
72 public static async Task WaitAsync(TimeSpan delay,
long sinceTimestamp)
74 if (delay <= TimeSpan.Zero)
return;
76 long target = sinceTimestamp + (long)(delay.TotalSeconds * Stopwatch.Frequency);
81 double remaining = RemainingMilliseconds(target);
82 if (remaining > SpinThresholdMilliseconds)
84 await Task.Delay((
int)(remaining - SpinThresholdMilliseconds)).ConfigureAwait(
false);
87 while (Stopwatch.GetTimestamp() < target)
93 private static double RemainingMilliseconds(
long target) =>
94 (target - Stopwatch.GetTimestamp()) * 1000.0 / Stopwatch.Frequency;