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.