MrHeisenberg AUG|Wings / Mbed 2 deprecated StateMachine

Dependencies:   mbed

main.cpp

Committer:
philipp19961
Date:
2014-09-29
Revision:
0:05d73097e319
Child:
1:c5769cd78933

File content as of revision 0:05d73097e319:

#include "mbed.h"

Ticker tick;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

InterruptIn button(p12);

// Zum Schalten: 1 Taster PINA PA0
// 1. Funktion
// Start-Taste 1x betätigen: 
// Dauerlicht aller 4 LEDs
// 2. Funktion
// Start-Taste ein 2.mal betätigen:
// LEDs blinken im ca. 400 Millisekunden-Takt; 200 msec Ein, 200 msec Aus
// Ausschalten des Rücklichts
// Die Start-Taste ein 3.mal betätigen:
// Alle LEDs aus.


//volatile uint8_t count;
volatile unsigned int count;
volatile unsigned int newEvent =0; 
volatile unsigned int event=0, state=0;

/* Prototypen der Funktionen */
int no_fu();
int ledsEin();
int msec300TimerOn();
int ledsAusTimerOff();
int ledsTogglen();

unsigned char nextstate_tab[2][3]=
//present state 0  1  2
//------------------------
/* event 0 */{{ 1, 2, 0 },  // next
/* event 1 */ { 0, 1, 2 }}; // state
// state=nextstate_tab[event][state]; // gehe auf naechsten Zustand

/*************************************************************/
/* Tabelle fuer Aktionsroutinen fuer die Zustaende bei Input */ 
/*************************************************************/
//                           p r e s e n t    s t a t e 
int(*action[2][3])()= //  0             1              2
/* event 0 */       {{ ledsEin, msec300TimerOn, ledsAusTimerOff },        
/* event 1 */        {  no_fu,       no_fu,       ledsTogglen }};       
// (*action[event][state])(); // suche in Tabelle nach Funktion


/* Aktionsroutinen, functions */
int no_fu()         // keine function - tue nichts
{
  return(0);
}

int msec300TimerOn()       
{
    __enable_irq(); 
    return(1);
}

int ledsAusTimerOff()        
{ 
    led1 = 0;
    led2 = 0;
    led3 = 0;
    led4 = 0;
    __disable_irq();
    return(2);
}

int ledsTogglen()   
{ 
    led1 = !led1;
    led2 = !led2;
    led3 = !led3;
    led4 = !led4;
    return(3);
}

int ledsEin()   
{ 
    led1 = 1;
    led2 = 1;
    led3 = 1;
    led4 = 1;
    return(4);
}

// interrupt SR
void timertick()
{
    ledsTogglen();
}

// functions
void initTimer()
{
    tick.attach(&timertick, 0.2);
}

void debounce(PinName name, unsigned char samples)
{
    DigitalIn joystick(name);
    
    for(unsigned char j = 0; j < samples; j++)
    {
        if(joystick == 1)
            j++;
        else
            j = 0;   
            
            if(j == samples)
                break;
    }    
}

void buttonpress()
{
        debounce(p12, 8);
        
        event =0;
        newEvent =1;

        if (newEvent)
        {
            __disable_irq();
            newEvent =0;
            (*action[event][state])(); // suche in Tabelle nach Funktion
            state=nextstate_tab[event][state]; // gehe auf naechsten Zustand
            __enable_irq();
        } 
}

int main()
{

  button.rise(&buttonpress);
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
  
    initTimer();
    
    newEvent = 0;
    state=0; 
    event=0;
}