Alif Ahmed / Mbed OS digitalInPolling_A1
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?

UserRevisionLine numberNew 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 }