#include <HFSM2/include/hfsm2/machine.hpp>
struct Context {
bool powerOn;
};
using M = hfsm2::MachineT<Context>;
//using M = hfsm2::MachineT<hfsm2::Config::ContextT<Context>>;
#define S(s) struct s
using FSM = M::PeerRoot<
S(Off), // initial top-level state
M::Composite<S(On), // sub-machine region with a head state (On) and and 3 sub-states
S(Red), // initial sub-state of the region
S(Yellow),
S(Green)
>,
S(Done)
>;
#undef S
struct Event {};
struct Off
: FSM::State
{
void entryGuard(FullControl& control) { // called before state activation, use to re-route transitions
if (control.context().powerOn) // access shared data
control.changeTo<On>(); // initiate a transition into 'On' region
}
};
struct On
: FSM::State
{
void enter(PlanControl& control) { // called on state activation
auto plan = control.plan(); // access the plan for the region
plan.append<Red, Yellow>(); // sequence plan steps, executed when the previous state succeeds
plan.append<Yellow, Green>();
plan.append<Green, Yellow>();
plan.append<Yellow, Red>();
}
void exit(PlanControl& /*control*/) {} // called on state deactivation
void planSucceeded(FullControl& control) { // called on the successful completion of all plan steps
control.changeTo<Done>();
}
void planFailed(FullControl& /*control*/) {} // called if any of the plan steps fails
};
struct Red
: FSM::State
{
void update(FullControl& control) { // called on periodic state machine updates
control.succeed(); // notify successful completion of the plan step
} // plan will advance to the 'Yellow' state
};
struct Yellow
: FSM::State
{
void update(FullControl& control) {
control.succeed(); // plan will advance to the 'Green' state on the first entry
// and 'Red' state on the second one
}
};
struct Green
: FSM::State
{
void react(const Event&, FullControl& control) { // called on external events
control.succeed(); // advance to the next plan step
}
};
struct Done
: FSM::State
{};
int main() {
Context context;
context.powerOn = true;
FSM fsm{ context };
assert(fsm.isActive<On>()); // activated by Off::entryGuard()
assert(fsm.isActive<Red>()); // On's initial sub-state
fsm.update();
assert(fsm.isActive<Yellow>()); // 1st setp of On's plan
fsm.update();
assert(fsm.isActive<Green>()); // 2nd setp of On's plan
fsm.react(Event{});
assert(fsm.isActive<Yellow>()); // 3rd setp of On's plan
fsm.update();
assert(fsm.isActive<Red>()); // 4th setp of On's plan
fsm.update();
assert(fsm.isActive<Done>()); // activated by On::planSucceeded()
return 0;
}
1>------ Build started: Project: prueba_hfsm2_msvc2019, Configuration: Debug x64 ------
1>main.cpp
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11821,16): error C2027: use of undefined type 'hfsm2::detail::M_<Context>'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11248): message : see declaration of 'hfsm2::detail::M_<Context>'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11821,1): error C2061: syntax error: identifier 'PeerRoot'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11823,8): error C2027: use of undefined type 'hfsm2::detail::M_<Context>'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11248): message : see declaration of 'hfsm2::detail::M_<Context>'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11827,5): error C2059: syntax error: '>'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11837,1): error C2653: 'FSM': is not a class or namespace name
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11837,1): error C2504: 'State': base class undefined
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11838,32): error C2061: syntax error: identifier 'FullControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11839,13): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11840,13): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11840,30): error C2065: 'On': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11840,1): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11846,1): error C2653: 'FSM': is not a class or namespace name
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11846,1): error C2504: 'State': base class undefined
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11847,27): error C2061: syntax error: identifier 'PlanControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11856,26): error C2061: syntax error: identifier 'PlanControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11858,35): error C2061: syntax error: identifier 'FullControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11862,32): error C2061: syntax error: identifier 'FullControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11848,21): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11850,1): error C3536: 'plan': cannot be used before it is initialized
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11850,1): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11851,1): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11852,1): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11853,1): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11859,9): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11859,1): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11867,1): error C2653: 'FSM': is not a class or namespace name
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11867,1): error C2504: 'State': base class undefined
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11868,28): error C2061: syntax error: identifier 'FullControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11869,9): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11875,1): error C2653: 'FSM': is not a class or namespace name
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11875,1): error C2504: 'State': base class undefined
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11876,28): error C2061: syntax error: identifier 'FullControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11877,9): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11884,1): error C2653: 'FSM': is not a class or namespace name
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11884,1): error C2504: 'State': base class undefined
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11885,41): error C2061: syntax error: identifier 'FullControl'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11886,9): error C2065: 'control': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11892,1): error C2653: 'FSM': is not a class or namespace name
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11892,1): error C2504: 'State': base class undefined
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11900,5): error C2065: 'FSM': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11900,9): error C2146: syntax error: missing ';' before identifier 'fsm'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11900,9): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11901,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11901,29): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11902,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11902,30): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11905,5): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11906,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11906,33): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11908,5): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11909,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11909,32): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11911,5): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11912,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11912,33): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11914,5): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11915,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11915,30): error C2059: syntax error: ')'
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11917,5): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11918,12): error C2065: 'fsm': undeclared identifier
1>P:\Mis-Proyectos\Profesional\Miniferias\prueba_hfsm2\inc\HFSM2\include\hfsm2\machine.hpp(11918,31): error C2059: syntax error: ')'
1>Done building project "prueba_hfsm2_msvc2019.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========