/// <summary>
/// 带消抖处理的上升沿检测器(精确到毫秒级)
/// </summary>
public class DebouncedRisingEdgeDetector
{
private bool _previousState;
private DateTime _lastTriggerTime = DateTime.MinValue;
private readonly int _debounceMs;
private readonly object _lock = new object();
/// <summary>
/// 初始化消抖检测器
/// </summary>
/// <param name="debounceMilliseconds">消抖时间(毫秒)</param>
/// <param name="initialState">初始输入状态</param>
public DebouncedRisingEdgeDetector(int debounceMilliseconds, bool initialState = false)
{
_debounceMs = debounceMilliseconds > 0 ? debounceMilliseconds : 10;
_previousState = initialState;
}
/// <summary>
/// 检测输入信号的有效上升沿
/// </summary>
public bool CheckForRisingEdge(bool currentState)
{
lock (_lock)
{
bool edgeDetected = false;
bool potentialEdge = !_previousState && currentState;
if (potentialEdge)
{
TimeSpan elapsed = DateTime.UtcNow - _lastTriggerTime;
if (elapsed.TotalMilliseconds > _debounceMs)
{
edgeDetected = true;
_lastTriggerTime = DateTime.UtcNow;
}
}
_previousState = currentState;
return edgeDetected;
}
}
/// <summary>
/// 重置检测器状态
/// </summary>
public void Reset(bool initialState = false)
{
lock (_lock)
{
_previousState = initialState;
_lastTriggerTime = DateTime.MinValue;
}
}
}
//初始化50ms消抖的检测器
var debounceDetector = new DebouncedRisingEdgeDetector(50);
//模拟带抖动的输入序列
bool[] noisyInputs = { false, true, false, true, true, false, true, true };
foreach (var input in noisyInputs)
{
bool validEdge = debounceDetector.CheckForRisingEdge(input);
Console.WriteLine($"输入 {input,-5} 有效触发: {validEdge}");
//模拟实际应用中的时间间隔
Thread.Sleep(30);
}
/* 输出结果:输入 False 有效触发: False
* 输入 True 有效触发: True ← 首次触发
* 输入 False 有效触发: False
* 输入 True 有效触发: False ← 30ms后仍在消抖期
* 输入 True 有效触发: False
* 输入 False 有效触发: False
* 输入 True 有效触发: True ← 超过50ms后再次触发
* 输入 True 有效触发: False
*/