# Kidule Ascenseur/Faire le programme Ascenseur
## Programme Ascenseur

C'est le moment de s'attaquer au programme proprement dit pour faire bouger notre ascenseur.
Mais avant de programmer, il faut réfléchir à ce que l’on veut faire. Première chose à remarquer, c’est que l’on devra faire plusieurs choses à la fois: lire des boutons, actionner le moteur, allumer et éteindre les Leds et se rappeler ce que l'ascenseur doit faire (monter au 1er étage par exemple).
Lorsque l’on a ce genre de problème (ce qui est très fréquent dans une machine ou dans un robot), la solution est souvent de dessiner un graphe d'états. Un graphe d'état est un dessin où on met une bulle par état possible de la machine. par exemple ici AuRez pour dire que l’on est au rez à attendre, ou encore Monte2eme pour dire que l’on va au 2eme.
Puis on trace avec des flèches tout ce qui est possible de faire en termes de changement d'état et à côté de la flèche on marque sous quelle condition on va changer d'état. Par exemple, on peut passer de AuRez à Monter1er si on a Bouton1er==Presse.

### Exercice

Essaie de tracer toutes les transitions qui sont possibles dans le cas de notre ascenseur. Pour cet exercice, on va imaginer que notre ascenseur est très simple:
* On ne peut lui donner qu'un ordre à la fois.
Par simplification, on n'a pas écrit à chaque transition ==Presse

## Traduction d'un graphe d'états en C

Pour traduire un graphe d'états en C, il nous faut:
* déclarer tous les états possibles
* déclarer une variable qui contient l'état
* avoir une instruction qui nous permet de faire un bout de programme différent pour chaque état
Pour le 1er point, il existe en C une instruction pour déclarer un type énuméré (qui énumère toutes les possibilités d'une variable de ce type)
enum permet de déclarer une énumération, et pour chaque énumération de lui attribuer la valeur qui sera utilisée dans le microprocesseur (optionnel). Dans notre cas, on peut écrire cela de la manière suivante:
pour le 2$^{eme}$ point, comme on vient de déclarer ce nouveau type, on peut juste après déclarer la variable Etat et lui donner sa valeur initiale.
pour le 3$^{eme}$ point, il existe une instruction un peu compliquée, mais qui fait exactement ce qu’il nous faut:
l'instruction switch permet de faire un bout de code ou un autre suivant la valeur d'une variable. On l'utilise de la manière suivante:
Pour chaque valeur qui nous intéresse, on met un case suivit de la valeur puis d'un : les instructions qui suivent ne seront exécutées si la variable du switch == la valeur. À la fin de ces instructions, on doit écrire un break; qui indique que l’on peut sauter à la fin de l'} du switch
Pour traduire notre graphe d'états en code, nous allons écrire un état par case du switch. Dans la première partie de l'état, on va mettre ce que l’on doit faire dans cet état comme par exemple Monter=..., Descendre=..., allumer des leds etc. Puis nous allons regarder s'il a a une transition possible avec un if(...) { Etat = nouvel_etat}. De cette manière, à chaque fois que la fonction GererAscenseur est appelée, on va effectuer les actions de cet état, puis regarder si la prochaine fois on doit exécuter un autre état.

### Exercice

Il faut maintenant coder notre programme. Pour pas trop se fatiguer, On peut copier le squelette de programme ci-dessous, et on remplacera tous les _A_CHANGER par quelque chose d'utile
* Tester le hardware