Franz Pucher / HIM0Board

You are viewing an older revision! See the latest version

STM Implementierung mit Klassen

Inhalt

#include "mbed.h"

PwmOut led1(p36);
PwmOut green(p5); 
PwmOut blue(p34);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

// States
//typedef enum {ST_EIN, ST_AUS, ST_ERROR, ST_STATE1} nextState;
// alternativ
const int ST_EIN = 0;
const int ST_AUS = 1;
const int ST_ERROR = 2;

Timeout err;

// ---------------- Transitions --------------------------
bool pressed = false;
/*void Error(){
    stm.state = 2;
    pressed = true;
}
void fall(void) { 
    pressed = true; 
    err.attach(&Error, 4.0);
}
*/
bool CheckFlag()
{
    if( pressed ) { 
        pressed=false; 
        return true; 
    }
    return false;
}
// ---------------- Event Klasse --------------------------
class SwEvent {
        InterruptIn isr;
        int16_t pressed;
        void RisingISR();

    public:
        SwEvent(PinName pin) : isr(pin)
        { pressed=0; }

        int CheckFlag(); // das muss im do-Zweig (while(true) Schleife) ständig abgefragt werden
        void Init();
};
 
int SwEvent::CheckFlag()
{
    if( pressed )
        { pressed=0; return 1; }
    return 0;
}

void SwEvent::Init() 
    { isr.rise(this, &SwEvent::RisingISR); }

void SwEvent::RisingISR() 
{
    if( isr.read() )
        pressed = 1;
}

SwEvent sw1(P0_10);

// ----------------- Stm Klasse -----------------------------
class Stm {
  public:
        Stm() { state=ST_AUS; }
        
        void Ein();
        void Aus();
        void Error();

        uint8_t state;
};


void Stm::Ein(){
    while(true) {
        led1 = 0;
        if(sw1.CheckFlag()) {
            if(state == ST_ERROR)
                return;
            state = ST_AUS;
            return;
        }
    }
}

void Stm::Aus(){
    while(true) {
        led1 = 1;
        if(sw1.CheckFlag()) {
            if(state == ST_ERROR)
                return;
            state = ST_EIN;
            return;
        }
    }
}

void Stm::Error(){
    while(1) {
        led3 = ~led3;
        wait_ms(200);
    }
}

Stm stm;

void stateMachine()
{
    switch (stm.state)
    {
    case ST_EIN: stm.Ein();
        break;
    case ST_AUS: stm.Aus();
        break;
    default: stm.Error();
        break;
    }
}

void Error(){
    stm.state = ST_ERROR;
    pressed = true;
}
void fall(void) { 
    pressed = true; 
    err.attach(&Error, 4.0);
}

int main()
{
    printf("Hello STM\n");
    // butt.attach_fall(&fall); //.attach_rise(&rise);
    sw1.Init();

    blue=green=1;
    while(1) {
        stateMachine(); 
    }
}

All wikipages