implement button press/release with double check using fall/rise & timeout

Dependencies:   mbed

Committer:
mintisan
Date:
Sun Aug 28 09:18:15 2016 +0000
Revision:
4:4086e27c299e
Parent:
3:e25965edbbe7
Child:
5:f89c9cfa6b38
version2: fall/raise interrupt with timeout double-check

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mintisan 0:6a3454713c54 1 #include "mbed.h"
mintisan 0:6a3454713c54 2
mintisan 2:d68f26154551 3 //------------------------------------
mintisan 3:e25965edbbe7 4 // USER_KEY-PB_3 / USER_BUTTON-PC_13
mintisan 2:d68f26154551 5 //------------------------------------
mintisan 2:d68f26154551 6 InterruptIn mybutton(PB_3);
mintisan 2:d68f26154551 7 //------------------------------------
mintisan 2:d68f26154551 8 // LED1-PA5
mintisan 2:d68f26154551 9 //------------------------------------
mintisan 0:6a3454713c54 10 DigitalOut myled(PA_5);
mintisan 2:d68f26154551 11 //------------------------------------
mintisan 2:d68f26154551 12 // Hyperterminal configuration
mintisan 2:d68f26154551 13 // 9600 bauds, 8-bit data, no parity
mintisan 2:d68f26154551 14 // SERIAL_TX-PA2, SERIAL_RX-PA3
mintisan 2:d68f26154551 15 //------------------------------------
mintisan 2:d68f26154551 16 Serial pc(PA_2, PA_3);
mintisan 2:d68f26154551 17
mintisan 3:e25965edbbe7 18 // http://www.amobbs.com/thread-4308630-1-1.html
mintisan 3:e25965edbbe7 19 Timeout flipper;
mintisan 3:e25965edbbe7 20
mintisan 4:4086e27c299e 21 #define entry() pc.printf("func:%s\n", __FUNCTION__)
mintisan 2:d68f26154551 22
mintisan 4:4086e27c299e 23 #define error() pc.printf("Error! func:%s, line: %d\n", __FUNCTION__, __LINE__)
mintisan 3:e25965edbbe7 24
mintisan 3:e25965edbbe7 25 enum{OFF=0,ON=1};
mintisan 3:e25965edbbe7 26 enum{PRESS= 0, RELEASE = 1, UNKNOWN};
mintisan 4:4086e27c299e 27 #define PRESS_JITTER_TIME 0.01 // 10ms
mintisan 4:4086e27c299e 28 #define RELEASE_JITTER_TIME 0.02 // 20ms
mintisan 3:e25965edbbe7 29 uint8_t flag_status = UNKNOWN;
mintisan 3:e25965edbbe7 30
mintisan 3:e25965edbbe7 31 void double_check(void)
mintisan 3:e25965edbbe7 32 {
mintisan 3:e25965edbbe7 33 //entry();
mintisan 3:e25965edbbe7 34 pc.printf("before = %d, now= %d\n",flag_status,mybutton.read());
mintisan 3:e25965edbbe7 35 switch(flag_status){
mintisan 3:e25965edbbe7 36 case PRESS:
mintisan 3:e25965edbbe7 37 if(mybutton.read() == PRESS){
mintisan 3:e25965edbbe7 38 myled = ON;
mintisan 3:e25965edbbe7 39 pc.printf("Pressed\n");
mintisan 3:e25965edbbe7 40 }
mintisan 3:e25965edbbe7 41 break;
mintisan 3:e25965edbbe7 42 case RELEASE:
mintisan 3:e25965edbbe7 43 if(mybutton.read() == RELEASE){
mintisan 3:e25965edbbe7 44 myled = OFF;
mintisan 3:e25965edbbe7 45 pc.printf("Released\n");
mintisan 3:e25965edbbe7 46 }
mintisan 3:e25965edbbe7 47 break;
mintisan 3:e25965edbbe7 48 default:
mintisan 3:e25965edbbe7 49 error();
mintisan 3:e25965edbbe7 50 break;
mintisan 3:e25965edbbe7 51 }
mintisan 3:e25965edbbe7 52 }
mintisan 3:e25965edbbe7 53
mintisan 2:d68f26154551 54 void pressed(void)
mintisan 2:d68f26154551 55 {
mintisan 3:e25965edbbe7 56 //entry();
mintisan 3:e25965edbbe7 57 if(myled.read()!=ON){
mintisan 3:e25965edbbe7 58 flag_status = PRESS;
mintisan 4:4086e27c299e 59 // double ckeck for press status
mintisan 4:4086e27c299e 60 flipper.attach(&double_check, PRESS_JITTER_TIME);
mintisan 3:e25965edbbe7 61 }
mintisan 2:d68f26154551 62 }
mintisan 2:d68f26154551 63
mintisan 2:d68f26154551 64 void released(void)
mintisan 2:d68f26154551 65 {
mintisan 3:e25965edbbe7 66 //entry();
mintisan 3:e25965edbbe7 67 if(myled.read()!=OFF){
mintisan 3:e25965edbbe7 68 flag_status = RELEASE;
mintisan 4:4086e27c299e 69 // double check for releasse status
mintisan 4:4086e27c299e 70 flipper.attach(&double_check, RELEASE_JITTER_TIME);
mintisan 3:e25965edbbe7 71 }
mintisan 2:d68f26154551 72 }
mintisan 0:6a3454713c54 73
mintisan 3:e25965edbbe7 74
mintisan 3:e25965edbbe7 75
mintisan 0:6a3454713c54 76 int main(void)
mintisan 0:6a3454713c54 77 {
mintisan 2:d68f26154551 78 mybutton.fall(&pressed);
mintisan 2:d68f26154551 79 mybutton.rise(&released);
mintisan 0:6a3454713c54 80 while(1) {
mintisan 0:6a3454713c54 81 }
mintisan 0:6a3454713c54 82 }