Implemented polling code to check button press and change speed of button flashing.
Fork of digitalInPolling_sample by
main.cpp
- Committer:
- natgovor
- Date:
- 2018-02-01
- Revision:
- 3:17c6a539bd7c
- Parent:
- 2:cd1fe8c29793
File content as of revision 3:17c6a539bd7c:
#include "mbed.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 (the default one) checks for the press event and toggles the LED DigitalIn b1(PTD0, PullUp); DigitalOut led(LED1); Thread pollT ; // thread to poll 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 (!b1.read()) { // now down pressEvent = 1 ; // transition occurred pos = down ; } break ; case down : if (b1 == 1) { // no longer down bcounter = 3 ; // wait four cycles pos = bounce ; } break ; case bounce : if (b1 == 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); } } /* ---- Main function (default thread) ---- Note that if this thread completes, nothing else works */ enum states { flashing, timeToCheck }; // flsh thread states int main() { int speed = 200; states state = flashing; int cycleCounter = 0; led = 0; // LED is on by default pollT.start(callback(polling)); while(true) { Thread::wait(100); cycleCounter++; if (cycleCounter == 1) { state = timeToCheck; } switch (state) { case flashing: if (cycleCounter == speed / 100) { led = !led; cycleCounter = 0; } break; case timeToCheck: if (pressEvent) { cycleCounter = 0; pressEvent = 0 ; // clear the event variable if (speed < 1000) { speed = speed + 200; } else { speed = 200; } } state = flashing; break; } } }