Solution to Interrupt Exercise
Fork of digitalInInterrupt_sample by
main.cpp
- Committer:
- WilliamMarshQMUL
- Date:
- 2017-01-23
- Revision:
- 0:a66a8cb0012c
- Child:
- 1:13e0c1956b54
File content as of revision 0:a66a8cb0012c:
#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 == 1) { // now down pressEvent = 1 ; // transition occurred pos = down ; } break ; case down : if (button == 0) { // no longer down bcounter = 3 ; // wait four cycles pos = bounce ; } break ; case bounce : if (button == 1) { // 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 }