Lab 2 Button Testing.

Fork of digitalInPolling_sample by William Marsh

main.cpp

Committer:
WilliamMarshQMUL
Date:
2017-01-24
Revision:
1:4709af498799
Parent:
0:a66a8cb0012c
Child:
2:cd1fe8c29793

File content as of revision 1:4709af498799:

#include "mbed.h"
#include "rtos.h"

// Labs 2: Example program for polling an input
// --------------------------------------------
// The program uses a thread to poll a digital input
//   - The thread monitors the position of the button
//   - When the button transitions up and down, a press event is signaled 
//   - Button bounce is guarded against
// A second thread checks for the press event and toggles the LED

DigitalIn button(PTD0, PullUp);
DigitalOut led(LED_RED);

Thread pollT ; // thread to poll
Thread flashT ; // thread to flash light
volatile int pressEvent = 0 ;  // Variabe set by the polling thread

enum buttonPos { up, down, bounce }; // Button positions
void polling() {
    buttonPos pos = up ;
    int bcounter = 0 ;
    while (true) {
        switch (pos) {
            case up :
                if (button == 0) {    // now down 
                    pressEvent = 1 ;  // transition occurred
                    pos = down ;
                }
                break ;
            case down : 
                if (button == 1) { // no longer down
                    bcounter = 3 ; // wait four cycles
                    pos = bounce ;
                }
                break ;
            case bounce :
                if (button == 0) { // down again - button has bounced
                    pos = down ;   // no event
                } else if (bcounter == 0) {
                    pos = up ;     // delay passed - reset to up
                } else {
                    bcounter-- ;   // continue waiting
                }
                break ;
        }
        Thread::wait(30);
    }
}

// Toggle the LED every time the button is pressed
void flash() {
    while(true) {
        if (pressEvent) {
            pressEvent = 0 ; // clear the event variable
            led = !led ;
        }
        Thread::wait(100) ;
    }
}

int main() {
    pollT.start(&polling) ; // start the polling thread running 
    flashT.start(&flash) ; // start the flashing thread running 
}