Machines à états finis

Avant propos : nous ne saurions détenir ici l'unique vérité sur la façon d'organiser la rédaction d'une machine à états finis, voici toutefois une méthode qui à fait ses preuves. Comme chaque méthode, elle dispose d'avantages et d'inconvénients.

Dans de nombreuses parties d'un logiciel pilotant un robot, on peut découper les choses en étapes. Il y a alors plusieurs approches :

  • une des plus intuitives consiste à “bloquer” le code dans une étape avant de passer à la suivante :
tant que(le bras n'est pas arrivé)
{
   //je bouge un bras
}
tant que(le robot n'est pas arrivé à sa destination)
{
   //je lui demande de rejoindre sa destination
}

Cette méthode est rapidement à proscrire : elle est peu évolutive, difficile à maintenir, elle ne permet pas de paralléliser facilement les nombreuses tâches inhérentes au pilotage d'un robot un peu sophistiqué.

  • le pilotage par machines à états finis assure une approche non blocante (pas de while !) : cette approche est évolutive, lisible, compatible avec l'évolution multitâche de chaque module logiciel…
tant que(le match n'est pas fini...)
{
en fonction de l'état dans lequel je suis, choisis :
  * si ETAT_MOUVEMENT_BRAS
          * entrée dans l'état : demande au bras de se déplacer 
          * si le bras est arrivé : on passe à l'état suivant
          * si le temps est écoulé : on déclenche le timeout et on se rend dans un état qui gère cette erreur
  * si ETAT_DEPLACEMENT_ROBOT
          * entrée dans l'état : demande au robot de se déplacer 
          * si le robot est arrivé : on passe à l'état suivant
          * si le temps est écoulé : on déclenche le timeout et on se rend dans un autre état qui gère cette erreur
}

Une façon de coder des machines à états en C est proposée ici : rédaction d'une machine à états en C.