예제 #1
0
int main()
{
    StateMachine stateMachine;

    stateMachine.setOnStartCallback([] () { std::cout << "state machine started" << std::endl; });
    stateMachine.setOnStopCallback([] () { std::cout << "state machine stopped" << std::endl; });

    State* state1 = new State();
    state1->setOnEnterCallback([] (const Event*) { std::cout << "entering state1" << std::endl; });
    state1->setOnExitCallback([] (const Event*) { std::cout << "exiting state1" << std::endl; });

    State* state2 = new State();
    state2->setOnEnterCallback([] (const Event*) { std::cout << "entering state2" << std::endl; });
    state2->setOnExitCallback([] (const Event*) { std::cout << "exiting state2" << std::endl; });

    State* state3 = new State();
    state3->setOnEnterCallback([] (const Event*) { std::cout << "entering state3" << std::endl; });
    state3->setOnExitCallback([] (const Event*) { std::cout << "exiting state3" << std::endl; });

    stateMachine.addTransition(12, state1, state2);
    stateMachine.addTransition(13, state1, state3);
    stateMachine.addTransition(23, state2, state3);
    stateMachine.addTransition(31, state3, state1);
    stateMachine.setInitialState(state1);

    stateMachine.start();

    stateMachine.postEvent(new Event(12));
    stateMachine.postEvent(new Event(23));
    stateMachine.postEvent(new Event(31));
    stateMachine.postEvent(new Event(13));

    return 0;
}
void subscribe_statemachine_to_interlayer(StateMachine &sm)
{
  QObject::connect(&interlayer, &Interlayer::signalEvent,
                   [&](const UserEvent &e) {
                     bool post{false};
                     switch (static_cast<int>(e.type())) {
                     case EventX:
                       post = true;
                       std::cout << "posting EventX" << std::endl;
                       break;
                     case EventO:
                       post = true;
                       std::cout << "posting EventO" << std::endl;
                       break;
                     case EventI:
                       post = true;
                       std::cout << "posting EventI" << std::endl;
                       break;
                     case EventT:
                       post = true;
                       std::cout << "posting EventT" << std::endl;
                       break;
                     default:
                       break;
                     }

                     if (post) {
                       sm.postEvent(new UserEvent{e});
                     }
                   });
}