4 flexible ways to implement key-press/release with double check
If your button/key is ideal, then your code will very easy as below.
myled = mybutton.read() ;
Note: we use the led to show the result.
But the reality is not always ideal, the button you buy/made may not so well.
When you press it, it will generate much blur just as blow. So you will output some wrong down/up.
You may think I may add some capacitor to filter the blur. But hardware is money.
So I will offer you 4 flexible ways to implement key press/release with double check. And I will analysis the trade-off between the 4 ways.
1. mbed OS
You need two threads to check press/release separately.
The main function is just as below as clearly after you implement key press/release:
/* * one thread for down check; * another thread for up check. */ int main(void) { myled = OFF; Thread thread_down(user_thread_down); Thread thread_up(user_thread_up); while(true){ } }
Import programNucleo_key_led_with_mbed_os
implement button press/release with double check using mbed OS
2. coroutine
You need two coroutines to check press/release separately.
The main function is just as below as clearly after you implement key press/release:
/* * one thread for down check; * another thread for up check. */ int main(void) { myled = OFF; Thread thread_down(user_thread_down); Thread thread_up(user_thread_up); while(true){ } }
Import programNucleo_key_led_with_coroutine
implement button press/release with double check using coroutine
3. two-tickers
You need two tickes to check press/release separately.
The main function is just as below as clearly after you implement key press/release:
/* * ticker down for down check; * ticker down for up check. */ int main(void) { myled = OFF; jitter_down.attach(&key_down_status, PRESS_JITTER_TIME); jitter_up.attach(&key_up_status, RELEASE_JITTER_TIME); while(1) { // extend more task here } }
Import programNucleo_key_led_with_ticker
implement button press/release with double check using two tickers
4. fall/rise edge & timeout
You need one fall/rise edge interrupt and one timeout interrupt to check press/release separately.
The main function is just as below as clearly after you implement key press/release:
/* * fall edge & timout interrupt for down check; * rise edge & timout interrupt for up check. */ int main(void) { myled = OFF; mybutton.fall(&pressed); mybutton.rise(&released); while(1) { // extend more task here } }
Import programNucleo_key_led_with_timeout
implement button press/release with double check using fall/rise & timeout
Compare trade-off
SoC component
- 1. one ticker interrupt + one mbed OS
- 2. one ticker interrupt + coroutine
- 3. two tickers interrupt
- 4. one fall/rise interrupt & one timeout interrupt
power
1 = 2 > 3 > 4
Note: the power SoC cost is determined by component used.
size
1 > 2 > 3 > 4
Note: both code and RAM
Complexity
1 < 2 < 3 < 4
flexible
1 > 2 > 3 > 4
Note: The more software abstracted, the flexible the system will be.
Reliability
1 = 2 = 3 > 4
After double checked, your code will support button not so well. :D
Please log in to post comments.