From cf9d46810b4d5c1804b080a58efefd59fc27f67e Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 26 Apr 2021 13:51:33 +0100 Subject: [PATCH] HFSM documentation --- support/hfsm.docx | Bin 0 -> 24750 bytes support/hfsm.png | Bin 0 -> 30754 bytes test/test_hfsm.cpp | 181 +++++++++++++++++++++++---------------------- 3 files changed, 93 insertions(+), 88 deletions(-) create mode 100644 support/hfsm.docx create mode 100644 support/hfsm.png diff --git a/support/hfsm.docx b/support/hfsm.docx new file mode 100644 index 0000000000000000000000000000000000000000..6740b9c3c8c0cb14a47dec3703b3902f61167718 GIT binary patch literal 24750 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 literal 0 HcmV?d00001 diff --git a/support/hfsm.png b/support/hfsm.png new file mode 100644 index 0000000000000000000000000000000000000000..316efee6c2a3ee49cec2c1bff7e22f0e6e7d6825 GIT binary patch literal 30754 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 literal 0 HcmV?d00001 diff --git a/test/test_hfsm.cpp b/test/test_hfsm.cpp index e081c9ca..bf18aa8a 100644 --- a/test/test_hfsm.cpp +++ b/test/test_hfsm.cpp @@ -61,8 +61,13 @@ SOFTWARE. // Created with asciiflow.com namespace { - const etl::message_router_id_t MOTOR_CONTROL = 0; - + struct HFsmId + { + enum + { + Motor_Control + }; + }; //*************************************************************************** // Events @@ -70,45 +75,45 @@ namespace { enum enum_type { - START, - STOP, - ESTOP, - STOPPED, - SET_SPEED, - RECURSIVE, - TIMEOUT, - UNSUPPORTED + Start, + Stop, + EStop, + Stopped, + Set_Speed, + Recursive, + Timeout, + Unsupported }; ETL_DECLARE_ENUM_TYPE(EventId, etl::message_id_t) - ETL_ENUM_TYPE(START, "Start") - ETL_ENUM_TYPE(STOP, "Stop") - ETL_ENUM_TYPE(ESTOP, "E-Stop") - ETL_ENUM_TYPE(STOPPED, "Stopped") - ETL_ENUM_TYPE(SET_SPEED, "Set Speed") - ETL_ENUM_TYPE(RECURSIVE, "Recursive") - ETL_ENUM_TYPE(TIMEOUT, "Timeout") - ETL_ENUM_TYPE(UNSUPPORTED, "Unsupported") + ETL_ENUM_TYPE(Start, "Start") + ETL_ENUM_TYPE(Stop, "Stop") + ETL_ENUM_TYPE(EStop, "E-Stop") + ETL_ENUM_TYPE(Stopped, "Stopped") + ETL_ENUM_TYPE(Set_Speed, "Set Speed") + ETL_ENUM_TYPE(Recursive, "Recursive") + ETL_ENUM_TYPE(Timeout, "Timeout") + ETL_ENUM_TYPE(Unsupported, "Unsupported") ETL_END_ENUM_TYPE }; //*********************************** - class Start : public etl::message + class Start : public etl::message { }; //*********************************** - class Stop : public etl::message + class Stop : public etl::message { }; //*********************************** - class EStop : public etl::message + class EStop : public etl::message { }; //*********************************** - class SetSpeed : public etl::message + class SetSpeed : public etl::message { public: @@ -118,22 +123,22 @@ namespace }; //*********************************** - class Stopped : public etl::message + class Stopped : public etl::message { }; //*********************************** - class Recursive : public etl::message + class Recursive : public etl::message { }; //*********************************** - class Timeout : public etl::message + class Timeout : public etl::message { }; //*********************************** - class Unsupported : public etl::message + class Unsupported : public etl::message { }; @@ -143,20 +148,20 @@ namespace { enum enum_type { - IDLE, - RUNNING, - WINDING_UP, - WINDING_DOWN, - AT_SPEED, - NUMBER_OF_STATES + Idle, + Running, + Winding_Up, + Winding_Down, + At_Speed, + Number_Of_States }; ETL_DECLARE_ENUM_TYPE(StateId, etl::fsm_state_id_t) - ETL_ENUM_TYPE(IDLE, "Idle") - ETL_ENUM_TYPE(RUNNING, "Running") - ETL_ENUM_TYPE(WINDING_UP, "Winding Up") - ETL_ENUM_TYPE(WINDING_DOWN, "Winding Down") - ETL_ENUM_TYPE(AT_SPEED, "At Speed") + ETL_ENUM_TYPE(Idle, "Idle") + ETL_ENUM_TYPE(Running, "Running") + ETL_ENUM_TYPE(Winding_Up, "Winding Up") + ETL_ENUM_TYPE(Winding_Down, "Winding Down") + ETL_ENUM_TYPE(At_Speed, "At Speed") ETL_END_ENUM_TYPE }; @@ -168,7 +173,7 @@ namespace public: MotorControl() - : hfsm(MOTOR_CONTROL) + : hfsm(HFsmId::Motor_Control) { } @@ -238,7 +243,7 @@ namespace //*********************************** // The idle state. //*********************************** - class Idle : public etl::fsm_state + class Idle : public etl::fsm_state { public: @@ -246,14 +251,14 @@ namespace etl::fsm_state_id_t on_event(const Start&) { ++get_fsm_context().startCount; - return StateId::RUNNING; + return StateId::Running; } //*********************************** etl::fsm_state_id_t on_event(const Recursive&) { get_fsm_context().queue_recursive_message(Start()); - return StateId::IDLE; + return StateId::Idle; } //*********************************** @@ -274,7 +279,7 @@ namespace //*********************************** // The running state. //*********************************** - class Running : public etl::fsm_state + class Running : public etl::fsm_state { public: @@ -283,7 +288,7 @@ namespace { ++get_fsm_context().stopCount; - return StateId::IDLE; + return StateId::Idle; } //*********************************** @@ -305,7 +310,7 @@ namespace //*********************************** // The winding up state. //*********************************** - class WindingUp : public etl::fsm_state + class WindingUp : public etl::fsm_state { public: @@ -313,14 +318,14 @@ namespace etl::fsm_state_id_t on_event(const Stop&) { ++get_fsm_context().stopCount; - return StateId::WINDING_DOWN; + return StateId::Winding_Down; } //*********************************** etl::fsm_state_id_t on_event(const Timeout&) { ++get_fsm_context().windUpCompleteCount; - return StateId::AT_SPEED; + return StateId::At_Speed; } //*********************************** @@ -341,14 +346,14 @@ namespace //*********************************** // The at speed state. //*********************************** - class AtSpeed : public etl::fsm_state + class AtSpeed : public etl::fsm_state { public: //*********************************** etl::fsm_state_id_t on_event(const Stop&) { ++get_fsm_context().stopCount; - return StateId::WINDING_DOWN; + return StateId::Winding_Down; } //*********************************** @@ -371,7 +376,7 @@ namespace //*********************************** // The winding down state. //*********************************** - class WindingDown : public etl::fsm_state + class WindingDown : public etl::fsm_state { public: @@ -379,7 +384,7 @@ namespace etl::fsm_state_id_t on_event(const Stopped&) { ++get_fsm_context().stoppedCount; - return StateId::IDLE; + return StateId::Idle; } //*********************************** @@ -397,7 +402,7 @@ namespace WindingDown windingDown; AtSpeed atSpeed; - etl::ifsm_state* stateList[StateId::NUMBER_OF_STATES] = + etl::ifsm_state* stateList[StateId::Number_Of_States] = { &idle, &running, &windingUp, &windingDown, &atSpeed }; @@ -433,8 +438,8 @@ namespace // Now in Idle state. - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(false, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -451,8 +456,8 @@ namespace motorControl.receive(Stopped()); motorControl.receive(SetSpeed(10)); - CHECK_EQUAL(StateId::IDLE, motorControl.get_state_id()); - CHECK_EQUAL(StateId::IDLE, motorControl.get_state().get_state_id()); + CHECK_EQUAL(StateId::Idle, motorControl.get_state_id()); + CHECK_EQUAL(StateId::Idle, motorControl.get_state().get_state_id()); CHECK_EQUAL(false, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -469,8 +474,8 @@ namespace // Now in WindingUp state. - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -486,8 +491,8 @@ namespace motorControl.receive(Start()); motorControl.receive(Stopped()); - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -502,8 +507,8 @@ namespace // Send Timeout event motorControl.receive(Timeout()); - CHECK_EQUAL(StateId::AT_SPEED, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::AT_SPEED, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::At_Speed, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::At_Speed, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -520,8 +525,8 @@ namespace // Still in at speed state. - CHECK_EQUAL(StateId::AT_SPEED, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::AT_SPEED, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::At_Speed, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::At_Speed, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(1, motorControl.setSpeedCount); @@ -538,8 +543,8 @@ namespace // Now in WindingDown state. - CHECK_EQUAL(StateId::WINDING_DOWN, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::WINDING_DOWN, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Winding_Down, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Winding_Down, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(1, motorControl.setSpeedCount); @@ -556,8 +561,8 @@ namespace motorControl.receive(Stop()); motorControl.receive(SetSpeed(100)); - CHECK_EQUAL(StateId::WINDING_DOWN, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::WINDING_DOWN, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Winding_Down, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Winding_Down, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(1, motorControl.setSpeedCount); @@ -573,8 +578,8 @@ namespace motorControl.receive(Stopped()); // Now in Idle state. - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(false, motorControl.isLampOn); CHECK_EQUAL(1, motorControl.setSpeedCount); @@ -609,8 +614,8 @@ namespace // Now in winding up state. - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -626,8 +631,8 @@ namespace motorControl.receive(EStop()); // Now in Idle state. - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(false, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -663,8 +668,8 @@ namespace // Now in at speed state. - CHECK_EQUAL(StateId::AT_SPEED, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::AT_SPEED, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::At_Speed, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::At_Speed, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -680,8 +685,8 @@ namespace motorControl.receive(EStop()); // Now in Idle state. - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::IDLE, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Idle, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(false, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -720,8 +725,8 @@ namespace // Now in winding up state. - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state_id())); - CHECK_EQUAL(StateId::WINDING_UP, int(motorControl.get_state().get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state_id())); + CHECK_EQUAL(StateId::Winding_Up, int(motorControl.get_state().get_state_id())); CHECK_EQUAL(true, motorControl.isLampOn); CHECK_EQUAL(0, motorControl.setSpeedCount); @@ -735,11 +740,11 @@ namespace //************************************************************************* TEST(test_hfsm_supported) { - CHECK(motorControl.accepts(EventId::SET_SPEED)); - CHECK(motorControl.accepts(EventId::START)); - CHECK(motorControl.accepts(EventId::STOP)); - CHECK(motorControl.accepts(EventId::STOPPED)); - CHECK(motorControl.accepts(EventId::UNSUPPORTED)); + CHECK(motorControl.accepts(EventId::Set_Speed)); + CHECK(motorControl.accepts(EventId::Start)); + CHECK(motorControl.accepts(EventId::Stop)); + CHECK(motorControl.accepts(EventId::Stopped)); + CHECK(motorControl.accepts(EventId::Unsupported)); CHECK(motorControl.accepts(SetSpeed(0))); CHECK(motorControl.accepts(Start())); @@ -765,12 +770,12 @@ namespace MotorControl mc; // Null state. - etl::ifsm_state* stateList[StateId::NUMBER_OF_STATES] = + etl::ifsm_state* stateList[StateId::Number_Of_States] = { &idle, &running, &windingUp, &windingDown, nullptr }; - CHECK_THROW(mc.set_states(stateList, StateId::NUMBER_OF_STATES), etl::fsm_null_state_exception); + CHECK_THROW(mc.set_states(stateList, StateId::Number_Of_States), etl::fsm_null_state_exception); } //************************************************************************* @@ -779,12 +784,12 @@ namespace MotorControl mc; // Incorrect order. - etl::ifsm_state* stateList[StateId::NUMBER_OF_STATES] = + etl::ifsm_state* stateList[StateId::Number_Of_States] = { &idle, &running, &windingDown, &windingUp, &atSpeed }; - CHECK_THROW(mc.set_states(stateList, StateId::NUMBER_OF_STATES), etl::fsm_state_list_order_exception); + CHECK_THROW(mc.set_states(stateList, StateId::Number_Of_States), etl::fsm_state_list_order_exception); } }; }