Fork of Tangara with customizations
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 
tangara-fw/lib/tinyfsm/examples/elevator
jacqueline a6ab150405 Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
..
Makefile Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
README.md Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
elevator.cpp Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
elevator.hpp Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
fsmlist.hpp Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
main.cpp Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
motor.cpp Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans
motor.hpp Add tinyfsm, start converting core functions to an FSM-based event loop il y a 3 ans

README.md

Elevator Project

Example implementation of a simplified elevator logic, using TinyFSM.

Overview

Imagine a elevator having:

  • "Call" button on each floor,
  • "Floor Sensor" on each floor, triggering an event as soon as the elevator arrives there,
  • "Alarm" button.

Implementation

The elevator example implements two state machines interacting with each other:

  1. Elevator

    • State: Idle
    • State: Moving
    • State: Panic
  2. Motor

    • State: Stopped
    • State: Up
    • State: Down

A good state machine design avoids circular dependencies at all cost: While the elevator sends events to the motor, the motor NEVER sends events to the elevator (top-down only).

FAQ

Did you notice the motor starting twice? This is by design, let's have a look at the call stack of fsm_list::start() in main.cpp:

FsmList<Motor, Elevator>::start()
   Motor::set_initial_state()
      Motor::current_state = Stopped
   Elevator::set_initial_state()
      Elevator::current_state = Idle
   Motor::enter()
      Motor:Stopped->entry()
         cout << "Motor: stopped"               <-- HERE
         Motor::direction = 0
   Elevator::enter()
      Elevator:Idle->entry()
         send_event(MotorStop)
            Motor::react(MotorStop)
               Motor:Stopped->transit<Stopped>
                  Motor:Stopped->exit()
                  Motor::current_state = Stopped
                  Motor:Stopped->entry()
                     cout << "Motor: stopped"   <-- HERE
                     Motor::direction = 0
            Elevator::react(MotorStop)

If we really had to work around this, we could either:

  1. Change the initialization (bad design practice!) in main.cpp:

    - fsm_list::start();
    + fsm_list::set_initial_state();
    + Elevator::enter();
    
  2. Modify the Motor:Stopped->entry() function in motor.cpp:

      class Stopped : public Motor {
        void entry() override {
    +     if(direction == 0)
    +       return;
          cout << "Motor: stopped" << endl;
          direction = 0;
        };