This example illustrates the use of simple stage machine to handle event within mbed. When any of the 3 push button is pressed, the stage (number) will be shown via the on-board LEDs. {{/media/uploads/yoonghm/state_machine_example.jpg}}

Dependencies:   mbed

/media/uploads/yoonghm/state_machine_example.jpg

main.cpp

Committer:
yoonghm
Date:
2011-12-08
Revision:
1:8cfb6bfdb4e0
Parent:
0:8e509fb9a48c

File content as of revision 1:8cfb6bfdb4e0:

#include "mbed.h"

/* Various states */
typedef enum tState 
{ 
  STATE_A,
  STATE_B,
  STATE_C 
} tState;

/* Variables */
tState       state;       /* Current state */
char         trigger;     /* Bit set to indicate which button triggers */

InterruptIn  button1(p5); /* interrupt for button 1 at pin 5 */
InterruptIn  button2(p6); /* interrupt for button 1 at pin 6 */
InterruptIn  button3(p7); /* interrupt for button 1 at pin 7 */
BusOut       task(LED1, LED2, LED3, LED4);

/* Interrupt handlers when buttons is pressed */
void int_button1() {trigger |= 0x01;}  
void int_button2() {trigger |= 0x02;}
void int_button3() {trigger |= 0x04;}

/* task to be executed during each state transition */
void do_task(int n) {task = n; wait(2.0);}

void sleep(void) {__WFI();} /* Power-saving sleeping mode */


int main() 
{
  /* Enable pull-down resistor for each button */
  button1.mode(PullDown);
  button2.mode(PullDown);
  button3.mode(PullDown);
  
  /* Assign ISR to each button */
  button1.rise(&int_button1);
  button2.rise(&int_button2);
  button3.rise(&int_button3);
  
  /* initial the state machine */
  state = STATE_A;
  do_task(STATE_A);
  
  while(1) 
  {
    /* While I am not triggered, sleep */
    while (!trigger)
      sleep();
    
    /* I am awake now. Check which button has triggered*/
    switch (state)
    {
      //////////////////////////////////////////////////////////////////
      case STATE_A:  ///////////////////////////////////////////////////
      //////////////////////////////////////////////////////////////////
        if (trigger & 0x01) /* Button 1 down */
        {
          do_task(1);
          state = STATE_B; /* Transit to STATE_B */
        }
        trigger = 0; /* Ignore other triggers in this state */
        break;

      //////////////////////////////////////////////////////////////////
      case STATE_B:  ///////////////////////////////////////////////////
      //////////////////////////////////////////////////////////////////
        if (trigger & 0x01) /* Button 1 down */
        {
          do_task(2);
          state = STATE_A;
        }
        if (trigger & 0x02) /* Button 2 down */
        {
          do_task(3);
          /* Remain in the same state */
        }
        if (trigger & 0x04) /* Button 3 down */
        {
          do_task(4);
          state = STATE_C;
        }
        trigger = 0; /* Ignore other triggers in this state */
        break;

      //////////////////////////////////////////////////////////////////
      case STATE_C:  ///////////////////////////////////////////////////
      //////////////////////////////////////////////////////////////////
        if (trigger & 0x04) /* Button 3 down */
        {
          do_task(5);
          state = STATE_A;
        }
        break;
    } /* while (!trigger) */
  } /* while (1) */
}