Nicholas Outram
/
Task324Solution_OO
updated for mbed-os 5.5
main.cpp
- Committer:
- noutram
- Date:
- 2017-07-13
- Revision:
- 0:7da792c21683
File content as of revision 0:7da792c21683:
#include "mbed.h" DigitalOut red_led(D7); DigitalOut yellow_led(D6); DigitalOut green_led(D5); DigitalIn SW1(D4); DigitalIn SW2(D3); //This is the solution based on the proposed flowchart. class SwitchState { private: //Enumerated type (integer) enum STATE { WAITING4PRESS=1, WAITING4BOUNCE_RISING=2, WAITING4RELEASE=4, WAITING4BOUNCE_FALLING=8 }; STATE state; //Current state in the FSM DigitalIn& sw; //Reference to a GPIO Input DigitalOut& led; //Reference to a GPIO Output Timer tmr; //Internal timer used for debounce //Toggle the LED state void toggleLed() { led = !led; } //Next state (circular pattern) void gotoNextState() { state = (state >> 3) | ((state << 1) & 0b1111); } //Constructor public: SwitchState(DigitalIn& gpioIn, DigitalOut& gpioOut) : sw(gpioIn), led(gpioOut) { state = WAITING4PRESS; tmr.stop(); tmr.reset(); } //Update the state using polling void updateState() { switch (state) { //Waiting for switch to be pressed case WAITING4PRESS: if (sw == 1) { //Output: start timer tmr.reset(); tmr.start(); //Next state gotoNextState(); puts("Entering state: WAITING4BOUNCE_RISING"); } break; //Waiting for 50ms to elapse case WAITING4BOUNCE_RISING: if (tmr.read_ms() > 50) { //Outputs: Stop timer tmr.stop(); //Next state gotoNextState(); puts("Entering state: WAITING4RELEASE"); } break; //Waiting for switch to be released case WAITING4RELEASE: if (sw == 0) { //Outputs: Toggle the LED and start timer toggleLed(); tmr.reset(); tmr.start(); //Next state gotoNextState(); puts("Entering state: WAITING4BOUNCE_FALLING"); } break; //Waiting 50ms for switch bounce case WAITING4BOUNCE_FALLING: if (tmr.read_ms() > 50) { //Outputs: Reset timer 1 tmr.stop(); tmr.reset(); //Next state: gotoNextState(); puts("Entering state: WAITING4PRESS"); } break; default: //Something has gone very wrong tmr.stop(); tmr.reset(); led = 0; state = WAITING4PRESS; puts("ERROR"); break; } //end switch } }; int main() { //Initial logging message puts("START"); //Create two objects using different inputs and outputs SwitchState s1(SW1, red_led); SwitchState s2(SW2, green_led); //Main Polling Loop while (true) { s1.updateState(); s2.updateState(); } //end while }