Skip to content

Commit 83b7f60

Browse files
committed
Added State Machine components
1 parent b3883ae commit 83b7f60

File tree

3 files changed

+316
-0
lines changed

3 files changed

+316
-0
lines changed

lib/Service/src/IState.h

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/* MIT License
2+
*
3+
* Copyright (c) 2023 - 2024 Andreas Merkle <web@blue-andi.de>
4+
*
5+
* Permission is hereby granted, free of charge, to any person obtaining a copy
6+
* of this software and associated documentation files (the "Software"), to deal
7+
* in the Software without restriction, including without limitation the rights
8+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
* copies of the Software, and to permit persons to whom the Software is
10+
* furnished to do so, subject to the following conditions:
11+
*
12+
* The above copyright notice and this permission notice shall be included in all
13+
* copies or substantial portions of the Software.
14+
*
15+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
* SOFTWARE.
22+
*/
23+
24+
/*******************************************************************************
25+
DESCRIPTION
26+
*******************************************************************************/
27+
/**
28+
* @brief Abstract state interface
29+
* @author Andreas Merkle <web@blue-andi.de>
30+
*
31+
* @addtogroup Application
32+
*
33+
* @{
34+
*/
35+
36+
#ifndef ISTATE_H
37+
#define ISTATE_H
38+
39+
/******************************************************************************
40+
* Compile Switches
41+
*****************************************************************************/
42+
43+
/******************************************************************************
44+
* Includes
45+
*****************************************************************************/
46+
47+
/******************************************************************************
48+
* Macros
49+
*****************************************************************************/
50+
51+
/******************************************************************************
52+
* Types and Classes
53+
*****************************************************************************/
54+
55+
/* Forward declaration */
56+
class StateMachine;
57+
58+
/** State interface */
59+
class IState
60+
{
61+
public:
62+
/**
63+
* Default constructor.
64+
*/
65+
IState()
66+
{
67+
}
68+
69+
/**
70+
* Default destructor.
71+
*/
72+
virtual ~IState()
73+
{
74+
}
75+
76+
/**
77+
* If the state is entered, this method will called once.
78+
*/
79+
virtual void entry() = 0;
80+
81+
/**
82+
* Processing the state.
83+
*
84+
* @param[in] sm State machine, which is calling this state.
85+
*/
86+
virtual void process(StateMachine& sm) = 0;
87+
88+
/**
89+
* If the state is left, this method will be called once.
90+
*/
91+
virtual void exit() = 0;
92+
93+
protected:
94+
private:
95+
};
96+
97+
/******************************************************************************
98+
* Functions
99+
*****************************************************************************/
100+
101+
#endif /* ISTATE_H */
102+
/** @} */

lib/Service/src/StateMachine.cpp

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/* MIT License
2+
*
3+
* Copyright (c) 2023 - 2024 Andreas Merkle <web@blue-andi.de>
4+
*
5+
* Permission is hereby granted, free of charge, to any person obtaining a copy
6+
* of this software and associated documentation files (the "Software"), to deal
7+
* in the Software without restriction, including without limitation the rights
8+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
* copies of the Software, and to permit persons to whom the Software is
10+
* furnished to do so, subject to the following conditions:
11+
*
12+
* The above copyright notice and this permission notice shall be included in all
13+
* copies or substantial portions of the Software.
14+
*
15+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
* SOFTWARE.
22+
*/
23+
24+
/*******************************************************************************
25+
DESCRIPTION
26+
*******************************************************************************/
27+
/**
28+
* @brief Statemachine
29+
* @author Andreas Merkle <web@blue-andi.de>
30+
*/
31+
32+
/******************************************************************************
33+
* Includes
34+
*****************************************************************************/
35+
#include <StateMachine.h>
36+
37+
/******************************************************************************
38+
* Compiler Switches
39+
*****************************************************************************/
40+
41+
/******************************************************************************
42+
* Macros
43+
*****************************************************************************/
44+
45+
/******************************************************************************
46+
* Types and classes
47+
*****************************************************************************/
48+
49+
/******************************************************************************
50+
* Prototypes
51+
*****************************************************************************/
52+
53+
/******************************************************************************
54+
* Local Variables
55+
*****************************************************************************/
56+
57+
/******************************************************************************
58+
* Public Methods
59+
*****************************************************************************/
60+
61+
void StateMachine::process()
62+
{
63+
/* Change state? */
64+
if (nullptr != m_nextState)
65+
{
66+
/* Leave current state */
67+
if (nullptr != m_currentState)
68+
{
69+
m_currentState->exit();
70+
}
71+
72+
m_currentState = m_nextState;
73+
m_nextState = nullptr;
74+
75+
/* Enter new state */
76+
m_currentState->entry();
77+
}
78+
79+
/* Process current state */
80+
if (nullptr != m_currentState)
81+
{
82+
m_currentState->process(*this);
83+
}
84+
}
85+
86+
/******************************************************************************
87+
* Protected Methods
88+
*****************************************************************************/
89+
90+
/******************************************************************************
91+
* Private Methods
92+
*****************************************************************************/
93+
94+
/******************************************************************************
95+
* External Functions
96+
*****************************************************************************/
97+
98+
/******************************************************************************
99+
* Local Functions
100+
*****************************************************************************/

lib/Service/src/StateMachine.h

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/* MIT License
2+
*
3+
* Copyright (c) 2023 - 2024 Andreas Merkle <web@blue-andi.de>
4+
*
5+
* Permission is hereby granted, free of charge, to any person obtaining a copy
6+
* of this software and associated documentation files (the "Software"), to deal
7+
* in the Software without restriction, including without limitation the rights
8+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
* copies of the Software, and to permit persons to whom the Software is
10+
* furnished to do so, subject to the following conditions:
11+
*
12+
* The above copyright notice and this permission notice shall be included in all
13+
* copies or substantial portions of the Software.
14+
*
15+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
* SOFTWARE.
22+
*/
23+
24+
/*******************************************************************************
25+
DESCRIPTION
26+
*******************************************************************************/
27+
/**
28+
* @brief Statemachine
29+
* @author Andreas Merkle <web@blue-andi.de>
30+
*
31+
* @addtogroup Application
32+
*
33+
* @{
34+
*/
35+
36+
#ifndef STATE_MACHINE_H
37+
#define STATE_MACHINE_H
38+
39+
/******************************************************************************
40+
* Compile Switches
41+
*****************************************************************************/
42+
43+
/******************************************************************************
44+
* Includes
45+
*****************************************************************************/
46+
#include "IState.h"
47+
48+
/******************************************************************************
49+
* Macros
50+
*****************************************************************************/
51+
52+
/******************************************************************************
53+
* Types and Classes
54+
*****************************************************************************/
55+
56+
/** The system state machine. */
57+
class StateMachine
58+
{
59+
public:
60+
/**
61+
* Default constructor.
62+
*/
63+
StateMachine() : m_currentState(nullptr), m_nextState(nullptr)
64+
{
65+
}
66+
67+
/**
68+
* Default destructor.
69+
*/
70+
~StateMachine()
71+
{
72+
}
73+
74+
/**
75+
* Set next state.
76+
*
77+
* @param[in] state Next state.
78+
*/
79+
void setState(IState* state)
80+
{
81+
m_nextState = state;
82+
}
83+
84+
/**
85+
* Get current state.
86+
*
87+
* @return Current state.
88+
*/
89+
IState* getState()
90+
{
91+
return m_currentState;
92+
}
93+
94+
/**
95+
* Process state machine.
96+
*/
97+
void process();
98+
99+
protected:
100+
private:
101+
IState* m_currentState; /**< Current active state */
102+
IState* m_nextState; /**< Next state */
103+
104+
/* Not allowed. */
105+
StateMachine(const StateMachine& sm); /**< Copy construction of an instance. */
106+
StateMachine& operator=(const StateMachine& sm); /**< Assignment of an instance. */
107+
};
108+
109+
/******************************************************************************
110+
* Functions
111+
*****************************************************************************/
112+
113+
#endif /* STATE_MACHINE_H */
114+
/** @} */

0 commit comments

Comments
 (0)