implement button press/release with double check using mbed OS

Committer:
mintisan
Date:
Sun Aug 28 12:29:03 2016 +0000
Revision:
0:4ff16441b862
setup two thread to double check down/up status

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mintisan 0:4ff16441b862 1 #include "mbed.h"
mintisan 0:4ff16441b862 2
mintisan 0:4ff16441b862 3 //------------------------------------
mintisan 0:4ff16441b862 4 // USER_KEY-PB_3 / USER_BUTTON-PC_13
mintisan 0:4ff16441b862 5 //------------------------------------
mintisan 0:4ff16441b862 6 InterruptIn mybutton(PB_3);
mintisan 0:4ff16441b862 7 //------------------------------------
mintisan 0:4ff16441b862 8 // LED1-PA5
mintisan 0:4ff16441b862 9 //------------------------------------
mintisan 0:4ff16441b862 10 DigitalOut myled(PA_5);
mintisan 0:4ff16441b862 11 //------------------------------------
mintisan 0:4ff16441b862 12 // Hyperterminal configuration
mintisan 0:4ff16441b862 13 // 9600 bauds, 8-bit data, no parity
mintisan 0:4ff16441b862 14 // SERIAL_TX-PA2, SERIAL_RX-PA3
mintisan 0:4ff16441b862 15 //------------------------------------
mintisan 0:4ff16441b862 16 Serial pc(PA_2, PA_3);
mintisan 0:4ff16441b862 17
mintisan 0:4ff16441b862 18 #define entry() pc.printf("func:%s\n", __FUNCTION__)
mintisan 0:4ff16441b862 19
mintisan 0:4ff16441b862 20 #define error() pc.printf("Error! func:%s, line: %d\n", __FUNCTION__, __LINE__)
mintisan 0:4ff16441b862 21
mintisan 0:4ff16441b862 22 enum{OFF=0,ON=1};
mintisan 0:4ff16441b862 23 enum{PRESS= 0, RELEASE = 1, UNKNOWN};
mintisan 0:4ff16441b862 24 #define PRESS_JITTER_TIME 10 // 10ms
mintisan 0:4ff16441b862 25 #define RELEASE_JITTER_TIME 20 // 20ms
mintisan 0:4ff16441b862 26 uint8_t cur_flag_status = UNKNOWN;
mintisan 0:4ff16441b862 27 uint8_t pre_flag_status = UNKNOWN;
mintisan 0:4ff16441b862 28
mintisan 0:4ff16441b862 29 void update_key_status(void)
mintisan 0:4ff16441b862 30 {
mintisan 0:4ff16441b862 31 pre_flag_status = cur_flag_status;
mintisan 0:4ff16441b862 32 cur_flag_status = mybutton.read();
mintisan 0:4ff16441b862 33 }
mintisan 0:4ff16441b862 34
mintisan 0:4ff16441b862 35 void key_down_status(void)
mintisan 0:4ff16441b862 36 {
mintisan 0:4ff16441b862 37 update_key_status();
mintisan 0:4ff16441b862 38 if(cur_flag_status == PRESS){
mintisan 0:4ff16441b862 39 if(myled.read()!=ON){
mintisan 0:4ff16441b862 40 if(pre_flag_status == PRESS){
mintisan 0:4ff16441b862 41 myled = ON;
mintisan 0:4ff16441b862 42 pc.printf("Pressed\n");
mintisan 0:4ff16441b862 43 }
mintisan 0:4ff16441b862 44 }
mintisan 0:4ff16441b862 45 }
mintisan 0:4ff16441b862 46 }
mintisan 0:4ff16441b862 47
mintisan 0:4ff16441b862 48 void key_up_status(void)
mintisan 0:4ff16441b862 49 {
mintisan 0:4ff16441b862 50 update_key_status();
mintisan 0:4ff16441b862 51 if(cur_flag_status == RELEASE){
mintisan 0:4ff16441b862 52 if(myled.read()!=OFF){
mintisan 0:4ff16441b862 53 if(pre_flag_status == RELEASE){
mintisan 0:4ff16441b862 54 myled = OFF;
mintisan 0:4ff16441b862 55 pc.printf("Released\n");
mintisan 0:4ff16441b862 56 }
mintisan 0:4ff16441b862 57 }
mintisan 0:4ff16441b862 58 }
mintisan 0:4ff16441b862 59 }
mintisan 0:4ff16441b862 60
mintisan 0:4ff16441b862 61 //https://developer.mbed.org/handbook/RTOS
mintisan 0:4ff16441b862 62 void user_thread_down(const void* args)
mintisan 0:4ff16441b862 63 {
mintisan 0:4ff16441b862 64 while(true){
mintisan 0:4ff16441b862 65 key_down_status();
mintisan 0:4ff16441b862 66 Thread::wait(PRESS_JITTER_TIME);
mintisan 0:4ff16441b862 67 }
mintisan 0:4ff16441b862 68 }
mintisan 0:4ff16441b862 69
mintisan 0:4ff16441b862 70 void user_thread_up(const void* args)
mintisan 0:4ff16441b862 71 {
mintisan 0:4ff16441b862 72 while(true){
mintisan 0:4ff16441b862 73 key_up_status();
mintisan 0:4ff16441b862 74 Thread::wait(RELEASE_JITTER_TIME);
mintisan 0:4ff16441b862 75 }
mintisan 0:4ff16441b862 76 }
mintisan 0:4ff16441b862 77
mintisan 0:4ff16441b862 78 /*
mintisan 0:4ff16441b862 79 * one thread for down check;
mintisan 0:4ff16441b862 80 * another thread for up check.
mintisan 0:4ff16441b862 81 */
mintisan 0:4ff16441b862 82 int main(void)
mintisan 0:4ff16441b862 83 {
mintisan 0:4ff16441b862 84 myled = OFF;
mintisan 0:4ff16441b862 85 Thread thread_down(user_thread_down);
mintisan 0:4ff16441b862 86 Thread thread_up(user_thread_up);
mintisan 0:4ff16441b862 87 while(true){
mintisan 0:4ff16441b862 88 }
mintisan 0:4ff16441b862 89 }