lab 2 part 1

Committer:
anair12345
Date:
Thu Feb 07 09:49:19 2019 +0000
Revision:
4:cfd889aca1e1
Parent:
3:8d87cbabe37e
lab2 ex1 final version

Who changed what in which revision?

UserRevisionLine numberNew 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
anair12345 4:cfd889aca1e1 16 //int noofcycles = 1 ;
anair12345 4:cfd889aca1e1 17 //int waittime = 0.1 ;
WilliamMarshQMUL 0:a66a8cb0012c 18
anair12345 4:cfd889aca1e1 19 int waittime [5] = { 2,4,6,8,10 };
WilliamMarshQMUL 0:a66a8cb0012c 20 enum buttonPos { up, down, bounce }; // Button positions
WilliamMarshQMUL 0:a66a8cb0012c 21 void polling() {
WilliamMarshQMUL 0:a66a8cb0012c 22 buttonPos pos = up ;
WilliamMarshQMUL 0:a66a8cb0012c 23 int bcounter = 0 ;
WilliamMarshQMUL 0:a66a8cb0012c 24 while (true) {
WilliamMarshQMUL 0:a66a8cb0012c 25 switch (pos) {
WilliamMarshQMUL 0:a66a8cb0012c 26 case up :
WilliamMarshQMUL 2:cd1fe8c29793 27 if (!b1.read()) { // now down
WilliamMarshQMUL 0:a66a8cb0012c 28 pressEvent = 1 ; // transition occurred
WilliamMarshQMUL 0:a66a8cb0012c 29 pos = down ;
WilliamMarshQMUL 0:a66a8cb0012c 30 }
WilliamMarshQMUL 0:a66a8cb0012c 31 break ;
WilliamMarshQMUL 0:a66a8cb0012c 32 case down :
WilliamMarshQMUL 2:cd1fe8c29793 33 if (b1 == 1) { // no longer down
WilliamMarshQMUL 0:a66a8cb0012c 34 bcounter = 3 ; // wait four cycles
WilliamMarshQMUL 0:a66a8cb0012c 35 pos = bounce ;
WilliamMarshQMUL 0:a66a8cb0012c 36 }
WilliamMarshQMUL 0:a66a8cb0012c 37 break ;
WilliamMarshQMUL 0:a66a8cb0012c 38 case bounce :
WilliamMarshQMUL 2:cd1fe8c29793 39 if (b1 == 0) { // down again - button has bounced
WilliamMarshQMUL 0:a66a8cb0012c 40 pos = down ; // no event
WilliamMarshQMUL 0:a66a8cb0012c 41 } else if (bcounter == 0) {
WilliamMarshQMUL 0:a66a8cb0012c 42 pos = up ; // delay passed - reset to up
WilliamMarshQMUL 0:a66a8cb0012c 43 } else {
WilliamMarshQMUL 0:a66a8cb0012c 44 bcounter-- ; // continue waiting
WilliamMarshQMUL 0:a66a8cb0012c 45 }
WilliamMarshQMUL 0:a66a8cb0012c 46 break ;
WilliamMarshQMUL 0:a66a8cb0012c 47 }
WilliamMarshQMUL 3:8d87cbabe37e 48 wait(0.03);
WilliamMarshQMUL 0:a66a8cb0012c 49 }
WilliamMarshQMUL 0:a66a8cb0012c 50 }
WilliamMarshQMUL 0:a66a8cb0012c 51
WilliamMarshQMUL 2:cd1fe8c29793 52 /* ---- Main function (default thread) ----
WilliamMarshQMUL 2:cd1fe8c29793 53 Note that if this thread completes, nothing else works
WilliamMarshQMUL 2:cd1fe8c29793 54 */
WilliamMarshQMUL 2:cd1fe8c29793 55 int main() {
WilliamMarshQMUL 2:cd1fe8c29793 56 led = 1 ; // Initially off
WilliamMarshQMUL 2:cd1fe8c29793 57 pollT.start(callback(polling));
anair12345 4:cfd889aca1e1 58 int i = 0 ;
anair12345 4:cfd889aca1e1 59 int count = waittime[i];
WilliamMarshQMUL 0:a66a8cb0012c 60 while(true) {
anair12345 4:cfd889aca1e1 61 wait(0.1);
WilliamMarshQMUL 0:a66a8cb0012c 62 if (pressEvent) {
WilliamMarshQMUL 0:a66a8cb0012c 63 pressEvent = 0 ; // clear the event variable
anair12345 4:cfd889aca1e1 64 i = (i+1)%5;
anair12345 4:cfd889aca1e1 65 count = waittime[i];
WilliamMarshQMUL 0:a66a8cb0012c 66 }
anair12345 4:cfd889aca1e1 67 else{
anair12345 4:cfd889aca1e1 68 if(count!=0){
anair12345 4:cfd889aca1e1 69 count-- ;
anair12345 4:cfd889aca1e1 70 }
anair12345 4:cfd889aca1e1 71 else if(count == 0){
anair12345 4:cfd889aca1e1 72 led = !led ;
anair12345 4:cfd889aca1e1 73 count = waittime[i];
anair12345 4:cfd889aca1e1 74 }
anair12345 4:cfd889aca1e1 75 }
anair12345 4:cfd889aca1e1 76
WilliamMarshQMUL 0:a66a8cb0012c 77 }
WilliamMarshQMUL 0:a66a8cb0012c 78 }