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

Dependencies:   mbed

main.cpp

Committer:
mintisan
Date:
2016-08-28
Revision:
4:4086e27c299e
Parent:
3:e25965edbbe7
Child:
5:f89c9cfa6b38

File content as of revision 4:4086e27c299e:

#include "mbed.h"

//------------------------------------
// USER_KEY-PB_3 / USER_BUTTON-PC_13
//------------------------------------
InterruptIn mybutton(PB_3);
//------------------------------------
// LED1-PA5
//------------------------------------
DigitalOut myled(PA_5);
//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
// SERIAL_TX-PA2, SERIAL_RX-PA3
//------------------------------------
Serial pc(PA_2, PA_3);

// http://www.amobbs.com/thread-4308630-1-1.html
Timeout flipper;

#define entry()    pc.printf("func:%s\n", __FUNCTION__)

#define error()    pc.printf("Error! func:%s, line: %d\n", __FUNCTION__, __LINE__)

enum{OFF=0,ON=1};
enum{PRESS= 0, RELEASE = 1, UNKNOWN};
#define PRESS_JITTER_TIME       0.01    // 10ms
#define RELEASE_JITTER_TIME     0.02    // 20ms
uint8_t flag_status = UNKNOWN;

void double_check(void)
{
    //entry();
    pc.printf("before = %d, now= %d\n",flag_status,mybutton.read());
    switch(flag_status){
    case PRESS:
       if(mybutton.read() == PRESS){
            myled = ON;
            pc.printf("Pressed\n");
       }
       break;
    case RELEASE:
       if(mybutton.read() == RELEASE){
            myled = OFF;
            pc.printf("Released\n");
       }
       break;
    default:
        error();
       break;
    }
}

void pressed(void)
{
    //entry();
    if(myled.read()!=ON){
        flag_status = PRESS;
        // double ckeck for press status
        flipper.attach(&double_check, PRESS_JITTER_TIME);
    }
}

void released(void)
{
    //entry();
    if(myled.read()!=OFF){
        flag_status = RELEASE;
        // double check for releasse status
        flipper.attach(&double_check, RELEASE_JITTER_TIME);
    }
}



int main(void)
{
    mybutton.fall(&pressed);
    mybutton.rise(&released);
    while(1) {
    }
}