implement button press/release with double check using two tickers

Dependencies:   mbed

Committer:
mintisan
Date:
Sun Aug 28 12:54:53 2016 +0000
Revision:
0:ebf8ee3811c2
implement button press/release with double check using two tickers; ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mintisan 0:ebf8ee3811c2 1 #include "mbed.h"
mintisan 0:ebf8ee3811c2 2
mintisan 0:ebf8ee3811c2 3 //------------------------------------
mintisan 0:ebf8ee3811c2 4 // USER_KEY-PB_3 / USER_BUTTON-PC_13
mintisan 0:ebf8ee3811c2 5 //------------------------------------
mintisan 0:ebf8ee3811c2 6 DigitalIn mybutton(PB_3);
mintisan 0:ebf8ee3811c2 7 //------------------------------------
mintisan 0:ebf8ee3811c2 8 // LED1-PA5
mintisan 0:ebf8ee3811c2 9 //------------------------------------
mintisan 0:ebf8ee3811c2 10 DigitalOut myled(PA_5);
mintisan 0:ebf8ee3811c2 11 //------------------------------------
mintisan 0:ebf8ee3811c2 12 // Hyperterminal configuration
mintisan 0:ebf8ee3811c2 13 // 9600 bauds, 8-bit data, no parity
mintisan 0:ebf8ee3811c2 14 // SERIAL_TX-PA2, SERIAL_RX-PA3
mintisan 0:ebf8ee3811c2 15 //------------------------------------
mintisan 0:ebf8ee3811c2 16 Serial pc(PA_2, PA_3);
mintisan 0:ebf8ee3811c2 17
mintisan 0:ebf8ee3811c2 18 Ticker jitter_down, jitter_up;
mintisan 0:ebf8ee3811c2 19
mintisan 0:ebf8ee3811c2 20 #define entry() pc.printf("func:%s\n", __FUNCTION__)
mintisan 0:ebf8ee3811c2 21
mintisan 0:ebf8ee3811c2 22 #define error() pc.printf("Error! func:%s, line: %d\n", __FUNCTION__, __LINE__)
mintisan 0:ebf8ee3811c2 23
mintisan 0:ebf8ee3811c2 24 enum{OFF=0,ON=1};
mintisan 0:ebf8ee3811c2 25 enum{PRESS= 0, RELEASE = 1, UNKNOWN};
mintisan 0:ebf8ee3811c2 26 #define PRESS_JITTER_TIME 0.01 // 10ms
mintisan 0:ebf8ee3811c2 27 #define RELEASE_JITTER_TIME 0.02 // 20ms
mintisan 0:ebf8ee3811c2 28 uint8_t cur_flag_status = UNKNOWN;
mintisan 0:ebf8ee3811c2 29 uint8_t pre_flag_status = UNKNOWN;
mintisan 0:ebf8ee3811c2 30
mintisan 0:ebf8ee3811c2 31 void update_key_status(void)
mintisan 0:ebf8ee3811c2 32 {
mintisan 0:ebf8ee3811c2 33 pre_flag_status = cur_flag_status;
mintisan 0:ebf8ee3811c2 34 cur_flag_status = mybutton.read();
mintisan 0:ebf8ee3811c2 35 }
mintisan 0:ebf8ee3811c2 36
mintisan 0:ebf8ee3811c2 37 void key_down_status(void)
mintisan 0:ebf8ee3811c2 38 {
mintisan 0:ebf8ee3811c2 39 update_key_status();
mintisan 0:ebf8ee3811c2 40 if(cur_flag_status == PRESS){
mintisan 0:ebf8ee3811c2 41 if(myled.read()!=ON){
mintisan 0:ebf8ee3811c2 42 if(pre_flag_status == PRESS){
mintisan 0:ebf8ee3811c2 43 myled = ON;
mintisan 0:ebf8ee3811c2 44 pc.printf("Pressed\n");
mintisan 0:ebf8ee3811c2 45 }
mintisan 0:ebf8ee3811c2 46 }
mintisan 0:ebf8ee3811c2 47 }
mintisan 0:ebf8ee3811c2 48 }
mintisan 0:ebf8ee3811c2 49
mintisan 0:ebf8ee3811c2 50 void key_up_status(void)
mintisan 0:ebf8ee3811c2 51 {
mintisan 0:ebf8ee3811c2 52 update_key_status();
mintisan 0:ebf8ee3811c2 53 if(cur_flag_status == RELEASE){
mintisan 0:ebf8ee3811c2 54 if(myled.read()!=OFF){
mintisan 0:ebf8ee3811c2 55 if(pre_flag_status == RELEASE){
mintisan 0:ebf8ee3811c2 56 myled = OFF;
mintisan 0:ebf8ee3811c2 57 pc.printf("Released\n");
mintisan 0:ebf8ee3811c2 58 }
mintisan 0:ebf8ee3811c2 59 }
mintisan 0:ebf8ee3811c2 60 }
mintisan 0:ebf8ee3811c2 61 }
mintisan 0:ebf8ee3811c2 62
mintisan 0:ebf8ee3811c2 63 /*
mintisan 0:ebf8ee3811c2 64 * ticker down for down check;
mintisan 0:ebf8ee3811c2 65 * ticker down for up check.
mintisan 0:ebf8ee3811c2 66 */
mintisan 0:ebf8ee3811c2 67 int main(void)
mintisan 0:ebf8ee3811c2 68 {
mintisan 0:ebf8ee3811c2 69 myled = OFF;
mintisan 0:ebf8ee3811c2 70 jitter_down.attach(&key_down_status, PRESS_JITTER_TIME);
mintisan 0:ebf8ee3811c2 71 jitter_up.attach(&key_up_status, RELEASE_JITTER_TIME);
mintisan 0:ebf8ee3811c2 72 while(1) {
mintisan 0:ebf8ee3811c2 73 // extend more task here
mintisan 0:ebf8ee3811c2 74 }
mintisan 0:ebf8ee3811c2 75 }