Md Golam Tanvir Zim / Mbed OS week02_digitalInPolling_modified
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?

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