Ted Lin
/
Nucleo_key_led_with_timeout
implement button press/release with double check using fall/rise & timeout
main.cpp@4:4086e27c299e, 2016-08-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |