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@4:fb8f64836723, 2019-01-29 (annotated)
- Committer:
- gtanvir
- Date:
- Tue Jan 29 19:58:04 2019 +0000
- Revision:
- 4:fb8f64836723
- Parent:
- 3:8d87cbabe37e
Working, Final, Viva(ed)
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| WilliamMarshQMUL | 0:a66a8cb0012c | 1 | #include "mbed.h" |
| gtanvir | 4:fb8f64836723 | 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 |
| gtanvir | 4:fb8f64836723 | 10 | |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 11 | DigitalIn b1(PTD0, PullUp); |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 12 | DigitalOut led(LED1); |
| WilliamMarshQMUL | 0:a66a8cb0012c | 13 | |
| gtanvir | 4:fb8f64836723 | 14 | |
| gtanvir | 4:fb8f64836723 | 15 | Thread pollT; // thread to poll |
| gtanvir | 4:fb8f64836723 | 16 | Thread flashL; //Flash the LED 100ms |
| gtanvir | 4:fb8f64836723 | 17 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 18 | volatile int pressEvent = 0 ; // Variabe set by the polling thread |
| gtanvir | 4:fb8f64836723 | 19 | float waiting_period[5] = {0.2, 0.4, 0.6, 0.8, 1.0}; |
| gtanvir | 4:fb8f64836723 | 20 | unsigned int i = 0, count = 0; |
| gtanvir | 4:fb8f64836723 | 21 | enum buttonPos { up, down, bounce }; // Button positions |
| WilliamMarshQMUL | 0:a66a8cb0012c | 22 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 23 | void polling() { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 24 | buttonPos pos = up ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 25 | int bcounter = 0 ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 26 | while (true) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 27 | switch (pos) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 28 | case up : |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 29 | if (!b1.read()) { // now down |
| WilliamMarshQMUL | 0:a66a8cb0012c | 30 | pressEvent = 1 ; // transition occurred |
| WilliamMarshQMUL | 0:a66a8cb0012c | 31 | pos = down ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 32 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 33 | break ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 34 | case down : |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 35 | if (b1 == 1) { // no longer down |
| WilliamMarshQMUL | 0:a66a8cb0012c | 36 | bcounter = 3 ; // wait four cycles |
| WilliamMarshQMUL | 0:a66a8cb0012c | 37 | pos = bounce ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 38 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 39 | break ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 40 | case bounce : |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 41 | if (b1 == 0) { // down again - button has bounced |
| WilliamMarshQMUL | 0:a66a8cb0012c | 42 | pos = down ; // no event |
| WilliamMarshQMUL | 0:a66a8cb0012c | 43 | } else if (bcounter == 0) { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 44 | pos = up ; // delay passed - reset to up |
| WilliamMarshQMUL | 0:a66a8cb0012c | 45 | } else { |
| WilliamMarshQMUL | 0:a66a8cb0012c | 46 | bcounter-- ; // continue waiting |
| WilliamMarshQMUL | 0:a66a8cb0012c | 47 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 48 | break ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 49 | } |
| WilliamMarshQMUL | 3:8d87cbabe37e | 50 | wait(0.03); |
| WilliamMarshQMUL | 0:a66a8cb0012c | 51 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 52 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 53 | |
| gtanvir | 4:fb8f64836723 | 54 | |
| gtanvir | 4:fb8f64836723 | 55 | |
| gtanvir | 4:fb8f64836723 | 56 | |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 57 | /* ---- Main function (default thread) ---- |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 58 | Note that if this thread completes, nothing else works |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 59 | */ |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 60 | int main() { |
| WilliamMarshQMUL | 2:cd1fe8c29793 | 61 | led = 1 ; // Initially off |
| gtanvir | 4:fb8f64836723 | 62 | pollT.start(callback(polling)); |
| gtanvir | 4:fb8f64836723 | 63 | |
| WilliamMarshQMUL | 0:a66a8cb0012c | 64 | while(true) { |
| gtanvir | 4:fb8f64836723 | 65 | //led = !led ; |
| gtanvir | 4:fb8f64836723 | 66 | wait(0.1); |
| gtanvir | 4:fb8f64836723 | 67 | count++; |
| gtanvir | 4:fb8f64836723 | 68 | if(count >= waiting_period[i]*10) { |
| gtanvir | 4:fb8f64836723 | 69 | led = !led; |
| gtanvir | 4:fb8f64836723 | 70 | count = 0 ; |
| WilliamMarshQMUL | 0:a66a8cb0012c | 71 | } |
| gtanvir | 4:fb8f64836723 | 72 | //wait(waiting_period[i]); |
| gtanvir | 4:fb8f64836723 | 73 | if (pressEvent) { |
| gtanvir | 4:fb8f64836723 | 74 | //Thread::wait(waiting_period[i]-count*100); |
| gtanvir | 4:fb8f64836723 | 75 | //wait(waiting_period[i]-count); |
| gtanvir | 4:fb8f64836723 | 76 | i++; |
| gtanvir | 4:fb8f64836723 | 77 | i = i%5; |
| gtanvir | 4:fb8f64836723 | 78 | //count = 0; |
| gtanvir | 4:fb8f64836723 | 79 | pressEvent = 0 ; // clear the event variable |
| gtanvir | 4:fb8f64836723 | 80 | } |
| gtanvir | 4:fb8f64836723 | 81 | //wait(0.1); |
| WilliamMarshQMUL | 0:a66a8cb0012c | 82 | } |
| WilliamMarshQMUL | 0:a66a8cb0012c | 83 | } |