Estoy monitoreando un botón pulsador con un microcontrolador donde trato de cuidar cuatro cosas juntos:
- 50-msec debounce en push-begin y 25-msec en push-release
- identificar una pulsación corta, definida como cuando se suelta el botón dentro de < 1 segundo
- identifique una retención prolongada, definida como cuando pasa 1 segundo desde que se presiona el botón de inicio
- duerme lo más posible cuando no estés haciendo otra cosa
A continuación se muestra un breve pseudocódigo de lo que he implementado hasta ahora. Creo que cubre todos estos casos.
¿Ve algún posible refinamiento o posible problema? (Por ejemplo, me interesan los casos sutiles que podrían ser puntos ciegos para mi enfoque).
Pseudocódigo:
Main loop {
Sleep
}
Falling-Interrupt {
Disable Falling-Interrupt
Enable 50-millisecond-Debounce-Timer-Interrupt
}
50-millisecond-Debounce-Timer-Interrupt {
if PushButton state is still LOW {
Enable Rising-Interrupt
Enable 1000-millisecond-Hold-Timer-Interrupt
}
}
1000-millisecond-Hold-Timer-Interrupt {
Register as Pushbutton long-hold
}
Rising-Interrupt {
if (Time since Falling-Interrupt < 1000 millisecond) {
Register as Button Short-press
}
Disable 1000-millisecond-Hold-Timer-Interrupt
Enable 25-millisecond-Debounce-Timer-Interrupt
}
25-millisecond-Debounce-Timer-Interrupt {
Enable Falling-Interrupt
}