This library is designed to create and run state graphs. It supports hierarchical states and the parallel execution

utt_foobar_with_ud.h

Committer:
martin13
Date:
2017-10-03
Revision:
1:0f11d9338d89
Parent:
0:f4fdca2c4c67

File content as of revision 1:0f11d9338d89:

#ifndef __UTT_FOOBAR_WUD_H__
#define __UTT_FOOBAR_WUD_H__

#include "StateMachine.h"

class Foo : public State{

public:

    static const char* OUTCOME_BAR;

    Foo(const char* uuid, UserData *ud):
        State(uuid),
        _count(0)
    {
        // Capture data ptr by key
        _data = ud->get<DataInt32*>("COUNT");
    }
    
    virtual void onEntry(){ /* Do something */ }
    
    virtual const char* onExecute(){
        
        _count++;
        
        return OUTCOME_BAR;
    }
    
    virtual void onExit(){
        // Update data
        _data->setData(_count);
    }
        
private:
    int _count;
    DataInt32 *_data;
};

const char* Foo::OUTCOME_BAR = "OUTCOME_BAR";

class Bar : public State{

public:

    static const char* OUTCOME_FOO;

    Bar(const char* uuid, UserData *ud):
      State(uuid)
    {
        // Capture data ptr
        _data = ud->get<DataInt32*>("COUNT");
    }
    
    virtual void onEntry(){
    }
    
    virtual const char* onExecute(){
        
        Logger::info("COUNT : %i",_data->getData());
        
        // Check data value
        if (_data->getData() >= 20){
            return SUCCEDED;    
        }
        
        return OUTCOME_FOO;
    }
    
    virtual void onExit(){    
    }
    
private:
    DataInt32 *_data;
};

const char* Bar::OUTCOME_FOO = "OUTCOME_FOO";

class FooBar : public StateMachine{

public:

    FooBar(const char* uuid, UserData *ud):
        StateMachine(uuid, ud),
        foo(NULL), bar(NULL)
    {
        // States instance
        foo = this->Instance<Foo>("FOO");
        bar = this->Instance<Bar>("BAR");
        
        // Connect Foo to Bar
        this->connect(STATE(foo), Foo::OUTCOME_BAR, STATE(bar));
        
        // Connect Bar to Foo
        this->connect(STATE(bar), Bar::OUTCOME_FOO, STATE(foo));
        
        // Connect Bar to exit state machine
        this->connect(STATE(bar), Bar::SUCCEDED, SUCCEDED);
        
        this->setInitialState(STATE(foo)); 
    }

private:
    Foo *foo;
    Bar *bar;
};

/*
InterruptIn button(PC_13);
DigitalOut led(LED1);
*/
void unit_test(){
    
    StateMachine root("FOOBAR_ROOT");
    
    button.rise(&root, &FooBar::preempt);
    
    DataInt32* data = new DataInt32(0);
    
    root.getUserData()->put("COUNT", data);
    
    FooBar *foobar1 = root.Instance<FooBar>("FOOBAR_1");
    FooBar *foobar2 = root.Instance<FooBar>("FOOBAR_2");
    
    root.setInitialState(STATE(foobar1));
    
    root.connect(STATE(foobar1), "SUCCEDED", STATE(foobar2));
    root.connect(STATE(foobar2), "SUCCEDED", "SUCCEDED");
    
    root.printGraph();
    
    printf("STATE MACHINE RETURN %s \n",root.execute()); 
}


#endif /* #ifndef __UTT_FOOBAR_WUD_H__*/