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.
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:8d87cbabe37e
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 | } |