University of Plymouth - Stages 1, 2 and 3 / Mbed OS Task330_polling

Fork of Task330_polling by University of Plymouth - Stages 1, 2 and 3

SWPoll.hpp

Committer:
noutram
Date:
2017-10-23
Revision:
0:397b84c74d17
Child:
1:e84a51c98d75

File content as of revision 0:397b84c74d17:

#include "mbed.h"

class SWPoll {
private:
    enum State {LOW, LOW_DEBOUNCE, HIGH, HIGH_DEBOUNCE};
    State state;
    DigitalIn& sw;
    DigitalOut& led;
    Timer t;    
    
public:
    SWPoll(DigitalIn& gpioIn, DigitalOut& gpioOut) : sw(gpioIn), led(gpioOut) {
        state = LOW;
        t.reset();
        led = 0;
    }    
    ~SWPoll() {
        //Shut down
        t.stop();
        t.reset();
        led = 0;   
    }
    void poll() {
        switch (state) 
        {
        //Waiting for switch to rise:
        case LOW:
            if (sw == 1) {
                state = LOW_DEBOUNCE;
                t.reset();
                t.start();
            }
            break;
            
        case LOW_DEBOUNCE:
            if (t.read_ms() >= 200) {
                state = HIGH;
                t.stop();
                t.reset();    
            }
            break;
        
        case HIGH:
            if (sw == 0) {
                state = HIGH_DEBOUNCE;
                t.reset();
                t.start();
            }
            break;
        case HIGH_DEBOUNCE:
            if (t.read_ms() >= 200) {
                state = LOW;
                t.stop();
                t.reset();  
                led = !led; //Toggle output on state transition  
            }
            break;            
         default:
            t.stop();
            t.reset();    
            state = LOW;
            break;
        }  //end switch
        
        //This is a Mealy Machine - so no output logic follows  
    }
};