
Lab version
Dependencies: mbed
Diff: main.cpp
- Revision:
- 0:bf0e4c6e1f4d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Mar 09 12:47:16 2016 +0000 @@ -0,0 +1,73 @@ +#include "mbed.h" + +void sw1TimeOutHandler(); +void sw1RisingEdge(); +void sw1FallingEdge(); + + +#define EDGE_RISEN 1 +#define EDGE_FALLEN 0 + +//Global Objects +DigitalOut red_led(D7); +DigitalOut green_led(D5); +InterruptIn sw1(D4); +InterruptIn sw2(D3); + +Timeout sw1TimeOut; //Used to prevent switch bounce +int sw1State = EDGE_FALLEN; //Initial state for switch 1 + +//Interrupt service routine for handling the timeout +void sw1TimeOutHandler() { + sw1TimeOut.detach(); //Stop the timeout counter firing + + //Which event does this follow? + switch (sw1State) { + case EDGE_RISEN: + sw1.fall(&sw1FallingEdge); //Now wait for a falling edge + break; + case EDGE_FALLEN: + sw1.rise(&sw1RisingEdge); //Now wait for a rising edge + break; + } //end switch +} + +//Interrupt service routine for a rising edge (press) +void sw1RisingEdge() { + sw1.rise(NULL); //Disable detecting more rising edges + sw1State = EDGE_RISEN; //Flag state + sw1TimeOut.attach(&sw1TimeOutHandler, 0.2); //Start timeout timer +} + +//Interrupt service routive for SW1 falling edge (release) +void sw1FallingEdge() { + sw1.fall(NULL); //Disable this interrupt + red_led = !red_led; //Toggle LED + sw1State = EDGE_FALLEN; //Flag state + sw1TimeOut.attach(&sw1TimeOutHandler, 0.2); //Start timeout counter +} + +//Main - only has to initialise and sleep +int main() { + //Initial logging message + puts("START"); + + //Initial state + red_led = 0; //Set RED LED to OFF + green_led = 1; + + //Configure interrupts, wait for first rising edge + sw1.rise(&sw1RisingEdge); + + //Main Polling Loop + while (true) { + + //Put CPU back to sleep + sleep(); + + //You can ONLY reach this point if an ISR wakes the CPU + puts("ISR just woke the MPU"); + + } //end while + +}