Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of digitalInPolling_sample by
main.cpp@2:cd1fe8c29793, 2018-01-16 (annotated)
- Committer:
- WilliamMarshQMUL
- Date:
- Tue Jan 16 18:02:44 2018 +0000
- Revision:
- 2:cd1fe8c29793
- Parent:
- 1:4709af498799
- Child:
- 3:ec275829202f
Corrected for mbed 5
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| WilliamMarshQMUL | 0:a66a8cb0012c | 1 | #include "mbed.h" |
| WilliamMarshQMUL | 0:a66a8cb0012c | 2 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 3 | // Labs 2: Example program for polling an input |
| WilliamMarshQMUL | 0:a66a8cb0012c | 4 | // -------------------------------------------- |
| WilliamMarshQMUL | 0:a66a8cb0012c | 5 | // The program uses a thread to poll a digital input |
| WilliamMarshQMUL | 0:a66a8cb0012c | 6 | // - The thread monitors the position of the button |
| WilliamMarshQMUL | 0:a66a8cb0012c | 7 | // - When the button transitions up and down, a press event is signaled |
| WilliamMarshQMUL | 0:a66a8cb0012c | 8 | // - Button bounce is guarded against |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 9 | // A second thread (the default one) checks for the press event and toggles the LED |
| WilliamMarshQMUL | 0:a66a8cb0012c | 10 | |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 11 | DigitalIn b1(PTD0, PullUp); |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 12 | DigitalOut led(LED1); |
| WilliamMarshQMUL | 0:a66a8cb0012c | 13 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 14 | Thread pollT ; // thread to poll |
| WilliamMarshQMUL | 0:a66a8cb0012c | 15 | volatile int pressEvent = 0 ; // Variabe set by the polling thread |
| WilliamMarshQMUL | 0:a66a8cb0012c | 16 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 17 | enum buttonPos { up, down, bounce }; // Button positions |
| WilliamMarshQMUL | 0:a66a8cb0012c | 18 | void polling() { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 19 | buttonPos pos = up ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 20 | int bcounter = 0 ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 21 | while (true) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 22 | switch (pos) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 23 | case up : |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 24 | if (!b1.read()) { // now down |
| WilliamMarshQMUL | 0:a66a8cb0012c | 25 | pressEvent = 1 ; // transition occurred |
| WilliamMarshQMUL | 0:a66a8cb0012c | 26 | pos = down ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 27 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 28 | break ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 29 | case down : |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 30 | if (b1 == 1) { // no longer down |
| WilliamMarshQMUL | 0:a66a8cb0012c | 31 | bcounter = 3 ; // wait four cycles |
| WilliamMarshQMUL | 0:a66a8cb0012c | 32 | pos = bounce ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 33 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 34 | break ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 35 | case bounce : |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 36 | if (b1 == 0) { // down again - button has bounced |
| WilliamMarshQMUL | 0:a66a8cb0012c | 37 | pos = down ; // no event |
| WilliamMarshQMUL | 0:a66a8cb0012c | 38 | } else if (bcounter == 0) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 39 | pos = up ; // delay passed - reset to up |
| WilliamMarshQMUL | 0:a66a8cb0012c | 40 | } else { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 41 | bcounter-- ; // continue waiting |
| WilliamMarshQMUL | 0:a66a8cb0012c | 42 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 43 | break ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 44 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 45 | Thread::wait(30); |
| WilliamMarshQMUL | 0:a66a8cb0012c | 46 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 47 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 48 | |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 49 | /* ---- Main function (default thread) ---- |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 50 | Note that if this thread completes, nothing else works |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 51 | */ |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 52 | int main() { |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 53 | led = 1 ; // Initially off |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 54 | pollT.start(callback(polling)); |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 55 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 56 | while(true) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 57 | if (pressEvent) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 58 | pressEvent = 0 ; // clear the event variable |
| WilliamMarshQMUL | 0:a66a8cb0012c | 59 | led = !led ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 60 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 61 | Thread::wait(100) ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 62 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 63 | } |
