Browse Source

separate states from state machine

master
Tim Zeuner 1 year ago
parent
commit
e7e40ef3b6
7 changed files with 116 additions and 113 deletions
  1. 1
    1
      CMakeLists.txt
  2. 11
    0
      lfr_state_interface.h
  3. 0
    53
      lfr_state_machine.cpp
  4. 8
    57
      lfr_state_machine.h
  5. 49
    0
      lfr_states.cpp
  6. 44
    0
      lfr_states.h
  7. 3
    2
      main.cpp

+ 1
- 1
CMakeLists.txt View File

add_subdirectory(Communication) add_subdirectory(Communication)
add_subdirectory(Socket) add_subdirectory(Socket)


add_executable(lfr_central main.cpp lfr_state_machine.cpp)
add_executable(lfr_central main.cpp lfr_state_machine.cpp lfr_states.cpp)


target_include_directories(lfr_central PRIVATE ${lfr_image_processing_SOURCE_DIRS}) target_include_directories(lfr_central PRIVATE ${lfr_image_processing_SOURCE_DIRS})
target_include_directories(lfr_central PRIVATE ${lfr_uart_SOURCE_DIRS}) target_include_directories(lfr_central PRIVATE ${lfr_uart_SOURCE_DIRS})

+ 11
- 0
lfr_state_interface.h View File

#pragma once

class LFR_StateMachine;

class LFR_IState
{
public:
virtual void enter(LFR_StateMachine* stateMachine) = 0;
virtual void exit(LFR_StateMachine* stateMachine) = 0;
virtual ~LFR_IState() {}
};

+ 0
- 53
lfr_state_machine.cpp View File

#include "lfr_state_machine.h" #include "lfr_state_machine.h"

/* void State::Idle::toggle(LFR_StateMachine* stateMachine)
{
stateMachine->setState()
} */

void State::Idle::enter(LFR_StateMachine* stateMachine)
{

}

void State::Idle::exit(LFR_StateMachine* stateMachine)
{
}

LFR_State& State::Idle::getInstance()
{
static State::Idle singleton;
return singleton;
}

void State::Autonomous::enter(LFR_StateMachine* stateMachine)
{

}

void State::Autonomous::exit(LFR_StateMachine* stateMachine)
{
stateMachine->setState(State::Idle::getInstance());
}

LFR_State& State::Autonomous::getInstance()
{
static State::Autonomous singleton;
return singleton;
}

void State::Manual::enter(LFR_StateMachine* stateMachine)
{

}

void State::Manual::exit(LFR_StateMachine* stateMachine)
{
stateMachine->setState(State::Idle::getInstance());
}

LFR_State& State::Manual::getInstance()
{
static State::Manual singleton;
return singleton;
}

+ 8
- 57
lfr_state_machine.h View File

#pragma once #pragma once

class LFR_StateMachine;

class LFR_State
{
public:
virtual void enter(LFR_StateMachine* stateMachine) = 0;
virtual void exit(LFR_StateMachine* stateMachine) = 0;
virtual ~LFR_State() {}
};


namespace State
{
class Idle: public LFR_State
{
Idle() {}
Idle(const Idle& other) {};
Idle& operator= (const Idle& other);

public:
void enter(LFR_StateMachine*);
void exit(LFR_StateMachine*);
static LFR_State& getInstance();
};


class Autonomous: public LFR_State
{
Autonomous() {}
Autonomous(const Autonomous& other) {};
Autonomous& operator= (const Autonomous& other);

public:
void enter(LFR_StateMachine*);
void exit(LFR_StateMachine*);
static LFR_State& getInstance();
};


class Manual: public LFR_State
{
Manual() {}
Manual(const Manual& other) {};
Manual& operator= (const Manual& other);

public:
void enter(LFR_StateMachine*);
void exit(LFR_StateMachine*);
static LFR_State& getInstance();
};
}
#include "lfr_state_interface.h"


class LFR_StateMachine class LFR_StateMachine
{ {
LFR_State* currentState;
LFR_IState* currentState;
LFR_StateMachine() = delete;
public: public:
LFR_StateMachine(){
setState(State::Idle::getInstance());
LFR_StateMachine(LFR_IState& startState){
currentState = &startState;
currentState->enter(this);
} }
inline LFR_State* getCurrentState() const {return currentState;}
void setState(LFR_State& newState)
inline LFR_IState* getCurrentState() const {return currentState;}
void setState(LFR_IState& newState)
{ {
currentState->exit(this); currentState->exit(this);
currentState = &newState; currentState = &newState;

+ 49
- 0
lfr_states.cpp View File

#include "lfr_states.h"

void State::Idle::enter(LFR_StateMachine* stateMachine)
{

}

void State::Idle::exit(LFR_StateMachine* stateMachine)
{
}

LFR_IState& State::Idle::getInstance()
{
static State::Idle singleton;
return singleton;
}

void State::Autonomous::enter(LFR_StateMachine* stateMachine)
{

}

void State::Autonomous::exit(LFR_StateMachine* stateMachine)
{
stateMachine->setState(State::Idle::getInstance());
}

LFR_IState& State::Autonomous::getInstance()
{
static State::Autonomous singleton;
return singleton;
}

void State::Manual::enter(LFR_StateMachine* stateMachine)
{

}

void State::Manual::exit(LFR_StateMachine* stateMachine)
{
stateMachine->setState(State::Idle::getInstance());
}

LFR_IState& State::Manual::getInstance()
{
static State::Manual singleton;
return singleton;
}

+ 44
- 0
lfr_states.h View File

#pragma once
#include "lfr_state_interface.h"
#include "lfr_state_machine.h"

namespace State
{
class Idle: public LFR_IState
{
Idle() {}
Idle(const Idle& other) {};
Idle& operator= (const Idle& other);

public:
void enter(LFR_StateMachine*);
void exit(LFR_StateMachine*);
static LFR_IState& getInstance();
};


class Autonomous: public LFR_IState
{
Autonomous() {}
Autonomous(const Autonomous& other) {};
Autonomous& operator= (const Autonomous& other);

public:
void enter(LFR_StateMachine*);
void exit(LFR_StateMachine*);
static LFR_IState& getInstance();
};


class Manual: public LFR_IState
{
Manual() {}
Manual(const Manual& other) {};
Manual& operator= (const Manual& other);

public:
void enter(LFR_StateMachine*);
void exit(LFR_StateMachine*);
static LFR_IState& getInstance();
};
}

+ 3
- 2
main.cpp View File

#include <lfr_socket.h> #include <lfr_socket.h>
#include <uart_communication.h> #include <uart_communication.h>
#include "lfr_state_machine.h" #include "lfr_state_machine.h"
#include "lfr_states.h"


int main(void) int main(void)
{ {


// Init State Machine; // Init State Machine;
std::cout << "create State Machine" << std::endl; std::cout << "create State Machine" << std::endl;
LFR_StateMachine stateMachine();
LFR_StateMachine stateMachine(State::Idle::getInstance());


// Init LFR Autonomous mode // Init LFR Autonomous mode
std::cout << "create lfr" << std::endl; std::cout << "create lfr" << std::endl;


//Start the permanent loop //Start the permanent loop
char input; char input;
std::cout << "fress q to quit" << std::endl;
std::cout << "press q to quit" << std::endl;
std::cin >> input; std::cin >> input;
std::cout << "cinned" << std::endl; std::cout << "cinned" << std::endl;
while (input != 'q') while (input != 'q')

Loading…
Cancel
Save