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@1:1ce199c334c2, 2020-09-18 (annotated)
- Committer:
- alifsohen
- Date:
- Fri Sep 18 13:21:20 2020 +0000
- Revision:
- 1:1ce199c334c2
- Parent:
- 0:f1c27b98a650
program: POLLING
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| WilliamMarshQMUL | 0:f1c27b98a650 | 1 | #include "mbed.h" |
| alifsohen | 1:1ce199c334c2 | 2 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 3 | // Sample answer for lab 2 |
| WilliamMarshQMUL | 0:f1c27b98a650 | 4 | // ----------------------- |
| WilliamMarshQMUL | 0:f1c27b98a650 | 5 | // Poll button |
| WilliamMarshQMUL | 0:f1c27b98a650 | 6 | // Vary period of flashing LED |
| WilliamMarshQMUL | 0:f1c27b98a650 | 7 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 8 | DigitalIn button(PTD0, PullUp); |
| WilliamMarshQMUL | 0:f1c27b98a650 | 9 | DigitalOut led(LED_RED); |
| WilliamMarshQMUL | 0:f1c27b98a650 | 10 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 11 | Thread pollT ; // thread to poll |
| WilliamMarshQMUL | 0:f1c27b98a650 | 12 | Thread flashT ; // thread to flash light |
| WilliamMarshQMUL | 0:f1c27b98a650 | 13 | volatile int event = 0 ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 14 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 15 | enum switchPos { up, down, bounce }; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 16 | void polling() { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 17 | switchPos pos = up ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 18 | int bcounter = 0 ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 19 | while (true) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 20 | switch (pos) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 21 | case up : |
| WilliamMarshQMUL | 0:f1c27b98a650 | 22 | if (button == 1) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 23 | event = 1 ; // transition occurred |
| WilliamMarshQMUL | 0:f1c27b98a650 | 24 | pos = down ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 25 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 26 | break ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 27 | case down : |
| WilliamMarshQMUL | 0:f1c27b98a650 | 28 | if (button == 0) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 29 | bcounter = 3 ; // wait four cycles |
| WilliamMarshQMUL | 0:f1c27b98a650 | 30 | pos = bounce ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 31 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 32 | break ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 33 | case bounce : |
| WilliamMarshQMUL | 0:f1c27b98a650 | 34 | if (button == 1) { // button has bounced |
| WilliamMarshQMUL | 0:f1c27b98a650 | 35 | pos = down ; // no event |
| WilliamMarshQMUL | 0:f1c27b98a650 | 36 | } else if (bcounter == 0) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 37 | pos = up ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 38 | } else { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 39 | bcounter-- ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 40 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 41 | break ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 42 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 43 | ThisThread::sleep_for(100) ; // delay for 100ms |
| WilliamMarshQMUL | 0:f1c27b98a650 | 44 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 45 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 46 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 47 | // Main thread |
| WilliamMarshQMUL | 0:f1c27b98a650 | 48 | // Start polling thread |
| WilliamMarshQMUL | 0:f1c27b98a650 | 49 | // Flash light with a period that varies with each button press |
| WilliamMarshQMUL | 0:f1c27b98a650 | 50 | int main() |
| WilliamMarshQMUL | 0:f1c27b98a650 | 51 | { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 52 | pollT.start(&polling) ; // start the polling thread running |
| WilliamMarshQMUL | 0:f1c27b98a650 | 53 | int delay = 1 ; // range 1, 2, 3, 4, 5 |
| WilliamMarshQMUL | 0:f1c27b98a650 | 54 | int counter = 0 ; // counter for cycles since last flash |
| WilliamMarshQMUL | 0:f1c27b98a650 | 55 | while(true) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 56 | counter++ ; // increment the counter |
| WilliamMarshQMUL | 0:f1c27b98a650 | 57 | if (event) { |
| WilliamMarshQMUL | 0:f1c27b98a650 | 58 | delay = (delay % 5) + 1 ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 59 | event = 0 ; // clear the event |
| WilliamMarshQMUL | 0:f1c27b98a650 | 60 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 61 | if (counter >= 2 * delay) { // 2, 4, 6, 8, 10 |
| WilliamMarshQMUL | 0:f1c27b98a650 | 62 | led = !led ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 63 | counter = 0 ; |
| WilliamMarshQMUL | 0:f1c27b98a650 | 64 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 65 | ThisThread::sleep_for(100) ; // delay for 100ms |
| WilliamMarshQMUL | 0:f1c27b98a650 | 66 | } |
| WilliamMarshQMUL | 0:f1c27b98a650 | 67 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 68 | |
| WilliamMarshQMUL | 0:f1c27b98a650 | 69 | } |