Automate

Dependencies:   Encoder_Nucleo_16_bits PwmIn mbed

Fork of TestBoard by IUT DE CACHAN GE1

Files at this revision

API Documentation at this revision

Comitter:
DOREL
Date:
Fri Jun 09 17:06:05 2017 +0000
Parent:
7:075ba099309b
Commit message:
Automate;

Changed in this revision

TestBoard.lib Show diff for this revision Revisions of this file
function_library.h Show annotated file Show diff for this revision Revisions of this file
include_define_typedeflibrary.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/TestBoard.lib	Thu Jun 08 13:04:22 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://developer.mbed.org/teams/IUT-DE-CACHAN-GE1/code/TestBoard/#4955cb4b3646
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/function_library.h	Fri Jun 09 17:06:05 2017 +0000
@@ -0,0 +1,275 @@
+//Variables
+
+Serial      Pixy    (PA_0, PA_1, 230400);
+Serial      Pc      (PA_2, PA_3, 921600);
+
+AnalogIn    CNY1    (PC_4);
+AnalogIn    CNY2    (PA_7);
+AnalogIn    CNY3    (PA_6);
+AnalogIn    LD1     (PC_0);
+AnalogIn    LD2     (PC_1);
+AnalogIn    SD1     (PB_0);
+AnalogIn    SD2     (PA_4);
+AnalogIn    Vbat    (PC_5);
+
+DigitalOut  Led1    (PA_5);
+DigitalOut  Led2    (PD_2);
+DigitalOut  Trig1   (PC_3);
+DigitalOut  Trig2   (PC_2);
+DigitalOut  Trig3   (PA_9);
+DigitalOut  En      (PC_9);
+DigitalOut  SensG   (PC_8);
+DigitalOut  SensD   (PC_6);
+DigitalOut  SS      (PA_12);
+
+InterruptIn Echo1   (PA_10);
+InterruptIn Echo2   (PA_11);
+InterruptIn Echo3   (PB_12);
+InterruptIn BP      (PC_13);
+InterruptIn IG      (PC_7);
+InterruptIn PWMG    (PB_2);
+InterruptIn PWMD    (PB_1);
+
+PwmIn       PWMB    (PA_15);
+
+PwmOut      Pwm_MG  (PB_10);
+PwmOut      Pwm_MD  (PB_3);
+PwmOut      Servo   (PA_8);
+
+I2C         Bus_I2C (PB_9, PB_8);
+
+SPI         SPIG    (PC_12, PC_11, PC_10);
+SPI         SPID    (PB_15, PB_14, PB_13);
+
+Nucleo_Encoder_16_bits  Gauche (TIM4);  // A = PB_6, B = PB_7
+Nucleo_Encoder_16_bits  Droite (TIM3);  // A = PB_4, B = PB_5
+
+Ticker      tick;
+Timer       times;
+
+/** Liste des variables globales
+ *
+ *  Tick        -> (long)   Compte le nombre de MS écoulé et déclenche l'exécution de la boucle en fonction du temps écoulé.
+ *  FlagIG      -> (int)    Indication de la présence de fronts sur l'index de l'encodeur de la roue gauche
+ *  FlagID      -> (int)    Indication de la présence de fronts sur l'index de l'encodeur de la roue droite
+ *  EchoXStart  -> (long)   Donne le temps en µs de début de l'impulsion d'écho de l'US n°X
+ *  DistUSX     -> (float)  Donne la distance en mm mesurée par l'US n°X
+ */
+
+// Structure de temps
+lWord               Tick = 0, Gperiod, Dperiod;
+
+// Sémaphore d'interruption
+int                 FlagUS1 = 0, FlagUS2 = 0, FlagUS3 = 0, FlagPixy = 0, FlagPixyOverflow = 0;
+int                 FlagTick = 0, FlagTickLed = 0, BPPressed = 0, nbTurnG = 0, nbTurnD = 0;
+int                 Pixy_check = -1;
+
+//  Dialogue avec la Pixy
+T_pixyCCData        Pixy_CCFIFO[20];
+T_pixyNMData        Pixy_NMFIFO[20];
+Byte                Pixy_CCObjet, Pixy_NMObjet;
+
+// Gestion des capteurs Ultrason
+long                Echo1Start, Echo2Start, Echo3Start;
+double              DistUS1, DistUS2, DistUS3;
+
+/** Liste des interruptions
+ *
+ */
+
+void tickTime() {
+    Tick++;
+    FlagTick = 1;
+    if ((Tick%100)==0)  FlagTickLed = 1;
+}
+
+void BPevent () {
+    BPPressed = 1;
+}
+
+void PWM_motGRise (void) {
+    static lWord    oldTime;
+    lWord           now;
+    now = times.read_us();
+    Gperiod = now-oldTime;
+    oldTime = now;
+    nbTurnG++;
+}
+
+void PWM_motDRise (void) {
+    static lWord    oldTime;
+    lWord           now;
+    now = times.read_us();
+    Dperiod = now-oldTime;
+    oldTime = now;
+    nbTurnD++;
+}
+
+void echo1Rise () {
+    Echo1Start = times.read_us();
+}
+
+void echo2Rise () {
+    Echo2Start = times.read_us();
+}
+
+void echo3Rise () {
+    Echo3Start = times.read_us();
+}
+
+void echo1Fall () {
+    DistUS1 = (double)(times.read_us() - Echo1Start)/5.8;
+    FlagUS1 = 1;
+}
+
+void echo2Fall () {
+    DistUS2 = (double)(times.read_us() - Echo2Start)/5.8;
+    FlagUS2 = 1;
+}
+
+void echo3Fall () {
+    DistUS3 = (double)(times.read_us() - Echo3Start)/5.8;
+    FlagUS3 = 1;
+}
+
+void getPixyByte () {
+    static T_tmpBuffer      tmpBuffer;
+    static T_structBuffer   msgBuffer;
+    static T_pixyState      PIXY_state = none;
+    static Byte             byteCount = 0;
+    static int              PIXY_synced = 0, dummy;
+    int                     i, somme;
+    static Byte             PIXY_nbCCObjet = 0, PIXY_wCCObjet = 0;
+    static Byte             PIXY_nbNMObjet = 0, PIXY_wNMObjet = 0;
+
+    Pixy_check = 0;
+
+    if (!PIXY_synced) {                                                         // On n'a pas trouvé le START (0x55aa0000)
+        tmpBuffer.tab[byteCount] = Pixy.getc();                                 // On stocke l'octet reçu dans la première case dispo du tableau temporaire
+
+        if (byteCount < 3) {                                                    // Si on n'a pas encore reçu les 4 premier octets
+            byteCount++;                                                        // On passe à la case suivante du tableau temporaire
+        } else {                                                                // Lorsqu'on a 4 octets
+            if (tmpBuffer.mot != 0xaa550000) {                                  // Si le code n'est pas le code de START
+                for (i=1; i<4; i++) tmpBuffer.tab[i-1] = tmpBuffer.tab[i];      // On décalle les cases du tableau
+                byteCount = 3;                                                  // Et on attend le caractère suivant
+            } else {                                                            // Si on a trouvé le code de START
+                PIXY_synced = 1;                                                // On passe en mode synchronisé
+                PIXY_state = begin;
+                byteCount = 0;
+            }
+        }
+    }
+
+    if (PIXY_synced) {
+
+        switch (PIXY_state) {
+            case begin :                                                        // l'aiguillage est là !
+
+                msgBuffer.tab[byteCount%2] = Pixy.getc();                       // on stocke les octets reçus
+                byteCount++;
+                if (byteCount == 2) {                                           // Quand on a 2 octets
+
+                    if (msgBuffer.mot == 0xaa55) {                              // Si c'est un bloc normal (code 0xAA55)
+                        PIXY_state = normal;                                    // On part vers le traitement spécifique
+                    }
+
+                    if (msgBuffer.mot == 0xaa56) {                              // Si c'est un bloc Color Code (code 0xAA56)
+                        PIXY_state = colorCode;                                 // On part vers le traitement spécifique
+                    }
+
+                    if (msgBuffer.mot == 0) {                                   // Si on a un debut de trame (code 0000)
+                        PIXY_state = doubleZero;                                // On part vers le traitement spécifique
+                    }
+                    if ((PIXY_state == begin) || (PIXY_state == none)) {        // Si c'est autre chose
+                        PIXY_synced = 0;                                        // C'est qu'on est perdu donc plus synchronisé.
+                        PIXY_state = none;                                      // Ceinture et bretelle
+                    }
+                    byteCount = 0;
+                }
+                break;
+
+            case normal :                                                       // Si on a un bloc normal
+
+                Pixy_NMFIFO[PIXY_wNMObjet].tab[byteCount] = Pixy.getc();        // On stocke les octets un à un dans la structure Bloc
+                if (byteCount < 11) {                                           // Tant que la structure n'est pas pleine
+                    byteCount++;                                                // On passe à l'octet suivant
+                } else {                                                        // Quand elle est pleine
+                    byteCount = 0;                                              // On réinitialise
+                    PIXY_state = begin;                                         // On retourne à l'aiguillage
+                    // On calcule la somme de contrôle
+                    somme = Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.signature + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.x + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.y + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.width + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.height;
+
+                    if (somme == Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.checksum) {  // Si le checksum est bon, on valide la réception
+                        if (PIXY_wNMObjet < 19)     PIXY_wNMObjet++;            // On incrémente le pointeur d'écriture dans la FIFO Objet
+                        else                        PIXY_wNMObjet = 0;
+                        if (PIXY_nbNMObjet < 19)    PIXY_nbNMObjet++;           // On dit que l'on a un objet CC de plus
+                        else                        FlagPixyOverflow = 1;       // Si on a plus de 20 CC objets (en attente) => Overflow
+                    }
+                }
+                break;
+
+            case colorCode :                                                    // Si on a un bloc colorCode
+
+                Pixy_CCFIFO[PIXY_wCCObjet].tab[byteCount] = dummy;              // On stocke les octets un à un dans la structure CCBloc
+                if (byteCount < 13) byteCount++;                                // tant que la structure n'est pas pleine on passe à l'octet suivant
+                else {                                                          // Quand elle est pleine
+                    byteCount = 0;                                              // On réinitialise
+                    PIXY_state = begin;                                         // On retourne à l'aiguillage
+                    // On calcule la somme de contrôle
+                    somme = Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.signature + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.x + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.y + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.width + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.height + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.angle;
+
+                    if (somme == Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.checksum) {  // Si le checksum est bon
+                        if (PIXY_wCCObjet < 19)     PIXY_wCCObjet++;            // On incrémente le pointeur d'écriture dans la FIFO CCObjet
+                        else                        PIXY_wCCObjet = 0;
+                        if (PIXY_nbCCObjet < 19)    PIXY_nbCCObjet++;           // On dit que l'on a un objet CC de plus à traiter
+                        else                        FlagPixyOverflow = 1;       // Si on a plus de 20 CC objets (en attente) => Overflow
+                    }
+                }
+                break;
+
+            case doubleZero :                                                   // Si on a reçu le code de début d'une nouvelle trame.
+
+                msgBuffer.tab[byteCount%2] = Pixy.getc();                       // on stocke les octets reçus
+                byteCount++;
+                if (byteCount == 2) {                                           // Quand on a 2 octets
+                    if (msgBuffer.mot == 0xaa55) {                              // On doit impérativement trouver le code 0xAA55
+                        PIXY_state = begin;                                     // Si c'est le cas, alors tout va bien et on va à l'aiguillage
+                        Pixy_NMObjet = PIXY_nbNMObjet;                          // On met à jour les variables pour le traitement
+                        Pixy_CCObjet = PIXY_nbCCObjet;
+                        PIXY_nbCCObjet = 0;
+                        PIXY_nbNMObjet = 0;
+                        FlagPixy = 1;                                           // On valide le traitement de la trame précédente.
+                    } else {                                                    // Si on trouve autre chose
+                        PIXY_synced = 0;                                        // C'est qu'on est perdu donc plus synchronisé.
+                        PIXY_state = none;                                      // Ceinture et bretelle
+                    }
+                    byteCount = 0;
+                }
+                break;
+        }
+    }
+}
+
+void ir_read(double SD2,double LD2,double *SD2_dist,double *LD2_dist) {
+    double SD2_val, LD2_val;
+
+    SD2_val = SD2;
+    LD2_val = LD2;
+
+    if (SD2_val < 0.06) {
+        SD2_val = 0;
+        *SD2_dist = 40;
+    } else {
+        *SD2_dist = 11.611/(SD2_val*3.3-0.0237);
+        if (*SD2_dist > 40) *SD2_dist = 40;
+    }
+
+    if (LD2_val < 0.1) {
+        LD2_val = 0;
+        *LD2_dist = 150;
+    } else {
+        *LD2_dist = 59.175/(LD2_val*3.3-0.0275);
+        if (*LD2_dist > 150) *LD2_dist = 150;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include_define_typedeflibrary.h	Fri Jun 09 17:06:05 2017 +0000
@@ -0,0 +1,90 @@
+//Include
+
+#include "mbed.h"
+#include "PwmIn.h"
+#include "Nucleo_Encoder_16_bits.h"
+
+//Defines
+
+#define BOUSSOLE_adress     0xC0
+#define PIXY_adress         0x54
+
+#define CC_BLOCSIZE         14
+#define N_BLOCSIZE          12
+
+#define N_BLOCCODE          0xAA55
+#define CC_BLOCCODE         0xAA56
+
+#define SPI_READ_NOP        0x0003
+#define SPI_READ_ANGLE      0xFFFF
+#define SPI_READ_ERROR      0x8002
+#define SPI_READ_SETTINGS1  0x1803
+#define SPI_READ_SETTINGS2  0x8902
+#define SPI_WRTIE_SETTINGS1 0x1800
+#define SPI_WRITE_SETTINGS2 0x9801
+
+//Defines automate
+
+#define START 0
+#define SEEK_BALL 1
+#define TURN_TO_BALL 2
+#define GO_TO_BALL 3
+#define CAPTURE_AND_TURN 4
+#define WALL_CAPTURE_AND_TURN 5
+#define RELEASE_CAPTURE 6
+#define BALL_LAUNCHING 7
+#define STOP_BALL_LAUNCHING 8
+#define TURN_TO_BASE 9
+#define RETURN 10
+#define WALL_RETURN 11
+#define STOP_RETURN 12
+#define SEEK_ROTATION 13
+
+//Typedef
+
+typedef unsigned char   Byte;
+typedef unsigned short  Word;
+typedef unsigned long   lWord;
+
+typedef enum {S_monte = 1, S_descente = 0} T_SERVODIR;
+
+typedef enum {none, begin, normal, colorCode, doubleZero} T_pixyState;
+
+typedef union {
+    lWord   mot;
+    Byte    tab[4];
+} T_tmpBuffer;
+
+typedef union {
+    Word    mot;
+    Byte    tab[2];
+} T_structBuffer;
+
+typedef struct {
+    Word    checksum;
+    Word    signature;
+    Word    x;
+    Word    y;
+    Word    width;
+    Word    height;
+    Word    angle;
+} T_pixyCCBloc;
+
+typedef struct {
+    Word    checksum;
+    Word    signature;
+    Word    x;
+    Word    y;
+    Word    width;
+    Word    height;
+} T_pixyNMBloc;
+
+typedef union {
+    Byte            tab[14];
+    T_pixyCCBloc    CCbloc;
+} T_pixyCCData;
+
+typedef union {
+    Byte            tab[12];
+    T_pixyNMBloc    NMbloc;
+} T_pixyNMData;
\ No newline at end of file
--- a/main.cpp	Thu Jun 08 13:04:22 2017 +0000
+++ b/main.cpp	Fri Jun 09 17:06:05 2017 +0000
@@ -7,431 +7,8 @@
  *
  */
 
-#include "mbed.h"
-#include "PwmIn.h"
-#include "Nucleo_Encoder_16_bits.h"
-
-#define BOUSSOLE_adress     0xC0
-#define PIXY_adress         0x54
-
-#define CC_BLOCSIZE         14
-#define N_BLOCSIZE          12
-
-#define N_BLOCCODE          0xAA55
-#define CC_BLOCCODE         0xAA56
-
-
-// Comme la nucleo est Little Endian et que l'AS5047D est Big Endian, les codes sont inversés
-//  Registre        Valeur (BE) Valeur (LE)
-//  NOP             0xC000      0x0003
-//  ANGLE           0xFFFF      0xFFFF
-//  ERROR           0x4001      0x8002
-//  SETTING1 (R)    0xC018      0x1803
-//  SETTING2 (R)    0x4019      0x8902
-//  SETTING1 (W)    0x0018      0x1800
-//  SETTING2 (W)    0x8019      0x9801
-
-#define SPI_READ_NOP        0x0003
-#define SPI_READ_ANGLE      0xFFFF
-#define SPI_READ_ERROR      0x8002
-#define SPI_READ_SETTINGS1  0x1803
-#define SPI_READ_SETTINGS2  0x8902
-#define SPI_WRTIE_SETTINGS1 0x1800
-#define SPI_WRITE_SETTINGS2 0x9801
-
-typedef unsigned char   Byte;
-typedef unsigned short  Word;
-typedef unsigned long   lWord;
-
-typedef enum {S_monte = 1, S_descente = 0} T_SERVODIR;
-
-typedef enum {none, begin, normal, colorCode, doubleZero} T_pixyState;
-
-typedef union {
-    lWord   mot;
-    Byte    tab[4];
-} T_tmpBuffer;
-
-typedef union {
-    Word    mot;
-    Byte    tab[2];
-} T_structBuffer;
-
-typedef struct {
-    Word    checksum;
-    Word    signature;
-    Word    x;
-    Word    y;
-    Word    width;
-    Word    height;
-    Word    angle;
-} T_pixyCCBloc;
-
-typedef struct {
-    Word    checksum;
-    Word    signature;
-    Word    x;
-    Word    y;
-    Word    width;
-    Word    height;
-} T_pixyNMBloc;
-
-typedef union {
-    Byte            tab[14];
-    T_pixyCCBloc    CCbloc;
-} T_pixyCCData;
-
-typedef union {
-    Byte            tab[12];
-    T_pixyNMBloc    NMbloc;
-} T_pixyNMData;
-
-
-
-/** Liste des objets
- *
- *  Serial #4   Pixy
- *  Serial #2   Pc
- *
- *  AnalogIn    C1, C2, C3, LD1, LD2, SD1, SD2, Vbat
- *
- *  DigitalOut  Led1, Led2, Trig1, Trig2, Trig3, En, SensG, SensD
- *
- *  InterruptIn IndexG, IndexD, Echo1, Echo2, Echo3, BP
- *
- *  PwmOut      Pwm_MG, Pwm_MD, Servo
- *
- *  PwmIn       PWMG, PWMD, PWMB
- *
- *  I2C         Bus_I2C
- *
- *  SPI         MotG, MotD
- *
- *  Nucleo_Encoder_16_bits  Gauche, Droite
- *
- *  Ticker      timer
- */
-
-/** Liste des PINs
- *
- * PIN MAP (ordre alphabetique) des PINs de la Nucléo 64 utilisée
- * PA_0    -> Pixy RX (Serial)
- * PA_1    -> Pixy TX (Serial)
- * PA_2    -> PC TX (Serial)
- * PA_3    -> PX RX (Serial)
- * PA_4    -> GP2 SD #2 (Analog In)
- * PA_5    -> LED1 (Digital Out)
- * PA_6    -> CNY3 (Analog In)
- * PA_7    -> CNY2 (Analog In)
- * PA_8    -> Servomoteur (PWM Out)
- * PA_9    -> US Trigger #3 (Digital Out)
- * PA_10   -> US Echo #1 (Pwm In)
- * PA_11   -> US Echo #2 (Pwm In)
- * PA_12   -> SS (SPI Slave Select) (Digital Out)
- * PA_13
- * PA_14
- * PA_15   -> Boussole (Pwm In)
- *
- * PB_0    -> GP2 SD #1 (Analog In)
- * PB_1    -> Position D (Pwm In)
- * PB_2    -> Position G (Pwm In)
- * PB_3    -> PWM Mot D (PWM Out)
- * PB_4    -> Enocdeur Droit A (QE)
- * PB_5    -> Enocdeur Droit B (QE)
- * PB_6    -> Enocdeur Gauche A (QE)
- * PB_7    -> Enocdeur Gauche B (QE)
- * PB_8    -> SCL (I2C)
- * PB_9    -> SDA (I2C)
- * PB_10   -> PWM Mot G (PWM Out)
- * PB_11
- * PB_12   -> US Echo #3 (Pwm In)
- * PB_13   -> SCK Encodeur D (SPI)
- * PB_14   -> MISO Encodeur D (SPI)
- * PB_15   -> MOSI Encodeur D (SPI)
- *
- * PC_0    -> GP2 LD #1 (Analog In)
- * PC_1    -> GP2 LD #2 (Analog In)
- * PC_2    -> US Trigger #2 (Digital Out)
- * PC_3    -> US Trigger #1 (Digital Out)
- * PC_4    -> CNY1 (Analog In)
- * PC_5    -> Vbat (Analog In)
- * PC_6    -> Dir Mot Droit (Digital Out)
- * PC_7    -> I (Encodeur Gauche) (IRQ In)
- * PC_8    -> Dir Mot Gauche (Digital Out)
- * PC_9    -> Enable Moteurs (Digital Out)
- * PC_10   -> SCK Encodeur G (SPI)
- * PC_11   -> MISO Encodeur G (SPI)
- * PC_12   -> MOSI Encodeur G (SPI)
- * PC_13   -> User BP (IRQ In)
- * PC_14
- * PC_15
- *
- * PD_1
- * PD_2    -> Led2 (Digital Out)
- */
-
-Serial      Pixy    (PA_0, PA_1, 230400);
-Serial      Pc      (PA_2, PA_3, 921600);
-
-AnalogIn    CNY1    (PC_4);
-AnalogIn    CNY2    (PA_7);
-AnalogIn    CNY3    (PA_6);
-AnalogIn    LD1     (PC_0);
-AnalogIn    LD2     (PC_1);
-AnalogIn    SD1     (PB_0);
-AnalogIn    SD2     (PA_4);
-AnalogIn    Vbat    (PC_5);
-
-DigitalOut  Led1    (PA_5);
-DigitalOut  Led2    (PD_2);
-DigitalOut  Trig1   (PC_3);
-DigitalOut  Trig2   (PC_2);
-DigitalOut  Trig3   (PA_9);
-DigitalOut  En      (PC_9);
-DigitalOut  SensG   (PC_8);
-DigitalOut  SensD   (PC_6);
-DigitalOut  SS      (PA_12);
-
-InterruptIn Echo1   (PA_10);
-InterruptIn Echo2   (PA_11);
-InterruptIn Echo3   (PB_12);
-InterruptIn BP      (PC_13);
-InterruptIn IG      (PC_7);
-InterruptIn PWMG    (PB_2);
-InterruptIn PWMD    (PB_1);
-
-PwmIn       PWMB    (PA_15);
-
-PwmOut      Pwm_MG  (PB_10);
-PwmOut      Pwm_MD  (PB_3);
-PwmOut      Servo   (PA_8);
-
-I2C         Bus_I2C (PB_9, PB_8);
-
-SPI         SPIG    (PC_12, PC_11, PC_10);
-SPI         SPID    (PB_15, PB_14, PB_13);
-
-Nucleo_Encoder_16_bits  Gauche (TIM4);  // A = PB_6, B = PB_7
-Nucleo_Encoder_16_bits  Droite (TIM3);  // A = PB_4, B = PB_5
-
-Ticker      tick;
-Timer       times;
-
-/** Liste des variables globales
- *
- *  Tick        -> (long)   Compte le nombre de MS écoulé et déclenche l'exécution de la boucle en fonction du temps écoulé.
- *  FlagIG      -> (int)    Indication de la présence de fronts sur l'index de l'encodeur de la roue gauche
- *  FlagID      -> (int)    Indication de la présence de fronts sur l'index de l'encodeur de la roue droite
- *  EchoXStart  -> (long)   Donne le temps en µs de début de l'impulsion d'écho de l'US n°X
- *  DistUSX     -> (float)  Donne la distance en mm mesurée par l'US n°X
- */
-
-// Structure de temps
-lWord               Tick = 0, Gperiod, Dperiod;
-
-// Sémaphore d'interruption
-int                 FlagUS1 = 0, FlagUS2 = 0, FlagUS3 = 0, FlagPixy = 0, FlagPixyOverflow = 0;
-int                 FlagTick = 0, FlagTickLed = 0, BPPressed = 0, nbTurnG = 0, nbTurnD = 0;
-int                 Pixy_check = -1;
-
-//  Dialogue avec la Pixy
-T_pixyCCData        Pixy_CCFIFO[20];
-T_pixyNMData        Pixy_NMFIFO[20];
-Byte                Pixy_CCObjet, Pixy_NMObjet;
-
-// Gestion des capteurs Ultrason
-long                Echo1Start, Echo2Start, Echo3Start;
-double              DistUS1, DistUS2, DistUS3;
-
-/** Liste des interruptions
- *
- */
-
-void tickTime()
-{
-    Tick++;
-    FlagTick = 1;
-    if ((Tick%100)==0)  FlagTickLed = 1;
-}
-
-void BPevent ()
-{
-    BPPressed = 1;
-}
-
-void PWM_motGRise (void)
-{
-    static lWord    oldTime;
-    lWord           now;
-    now = times.read_us();
-    Gperiod = now-oldTime;
-    oldTime = now;
-    nbTurnG++;
-}
-
-void PWM_motDRise (void)
-{
-    static lWord    oldTime;
-    lWord           now;
-    now = times.read_us();
-    Dperiod = now-oldTime;
-    oldTime = now;
-    nbTurnD++;
-}
-
-void echo1Rise ()
-{
-    Echo1Start = times.read_us();
-}
-
-void echo2Rise ()
-{
-    Echo2Start = times.read_us();
-}
-
-void echo3Rise ()
-{
-    Echo3Start = times.read_us();
-}
-
-void echo1Fall ()
-{
-    DistUS1 = (double)(times.read_us() - Echo1Start)/5.8;
-    FlagUS1 = 1;
-}
-
-void echo2Fall ()
-{
-    DistUS2 = (double)(times.read_us() - Echo2Start)/5.8;
-    FlagUS2 = 1;
-}
-
-void echo3Fall ()
-{
-    DistUS3 = (double)(times.read_us() - Echo3Start)/5.8;
-    FlagUS3 = 1;
-}
-
-void getPixyByte ()
-{
-    static T_tmpBuffer      tmpBuffer;
-    static T_structBuffer   msgBuffer;
-    static T_pixyState      PIXY_state = none;
-    static Byte             byteCount = 0;
-    static int              PIXY_synced = 0, dummy;
-    int                     i, somme;
-    static Byte             PIXY_nbCCObjet = 0, PIXY_wCCObjet = 0;
-    static Byte             PIXY_nbNMObjet = 0, PIXY_wNMObjet = 0;
-
-    Pixy_check = 0;
-
-    if (!PIXY_synced) {                                                         // On n'a pas trouvé le START (0x55aa0000)
-        tmpBuffer.tab[byteCount] = Pixy.getc();                                 // On stocke l'octet reçu dans la première case dispo du tableau temporaire
-
-        if (byteCount < 3) {                                                    // Si on n'a pas encore reçu les 4 premier octets
-            byteCount++;                                                        // On passe à la case suivante du tableau temporaire
-        } else {                                                                // Lorsqu'on a 4 octets
-            if (tmpBuffer.mot != 0xaa550000) {                                  // Si le code n'est pas le code de START
-                for (i=1; i<4; i++) tmpBuffer.tab[i-1] = tmpBuffer.tab[i];      // On décalle les cases du tableau
-                byteCount = 3;                                                  // Et on attend le caractère suivant
-            } else {                                                            // Si on a trouvé le code de START
-                PIXY_synced = 1;                                                // On passe en mode synchronisé
-                PIXY_state = begin;
-                byteCount = 0;
-            }
-        }
-    }
-
-    if (PIXY_synced) {
-
-        switch (PIXY_state) {
-            case begin :                                                        // l'aiguillage est là !
-
-                msgBuffer.tab[byteCount%2] = Pixy.getc();                       // on stocke les octets reçus
-                byteCount++;
-                if (byteCount == 2) {                                           // Quand on a 2 octets
-
-                    if (msgBuffer.mot == 0xaa55) {                              // Si c'est un bloc normal (code 0xAA55)
-                        PIXY_state = normal;                                    // On part vers le traitement spécifique
-                    }
-
-                    if (msgBuffer.mot == 0xaa56) {                              // Si c'est un bloc Color Code (code 0xAA56)
-                        PIXY_state = colorCode;                                 // On part vers le traitement spécifique
-                    }
-
-                    if (msgBuffer.mot == 0) {                                   // Si on a un debut de trame (code 0000)
-                        PIXY_state = doubleZero;                                // On part vers le traitement spécifique
-                    }
-                    if ((PIXY_state == begin) || (PIXY_state == none)) {        // Si c'est autre chose
-                        PIXY_synced = 0;                                        // C'est qu'on est perdu donc plus synchronisé.
-                        PIXY_state = none;                                      // Ceinture et bretelle
-                    }
-                    byteCount = 0;
-                }
-                break;
-
-            case normal :                                                       // Si on a un bloc normal
-
-                Pixy_NMFIFO[PIXY_wNMObjet].tab[byteCount] = Pixy.getc();        // On stocke les octets un à un dans la structure Bloc
-                if (byteCount < 11) {                                           // Tant que la structure n'est pas pleine
-                    byteCount++;                                                // On passe à l'octet suivant
-                } else {                                                        // Quand elle est pleine
-                    byteCount = 0;                                              // On réinitialise
-                    PIXY_state = begin;                                         // On retourne à l'aiguillage
-                    // On calcule la somme de contrôle
-                    somme = Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.signature + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.x + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.y + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.width + Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.height;
-
-                    if (somme == Pixy_NMFIFO[PIXY_wNMObjet].NMbloc.checksum) {  // Si le checksum est bon, on valide la réception
-                        if (PIXY_wNMObjet < 19)     PIXY_wNMObjet++;            // On incrémente le pointeur d'écriture dans la FIFO Objet
-                        else                        PIXY_wNMObjet = 0;
-                        if (PIXY_nbNMObjet < 19)    PIXY_nbNMObjet++;           // On dit que l'on a un objet CC de plus
-                        else                        FlagPixyOverflow = 1;       // Si on a plus de 20 CC objets (en attente) => Overflow
-                    }
-                }
-                break;
-
-            case colorCode :                                                    // Si on a un bloc colorCode
-
-                Pixy_CCFIFO[PIXY_wCCObjet].tab[byteCount] = dummy;              // On stocke les octets un à un dans la structure CCBloc
-                if (byteCount < 13) byteCount++;                                // tant que la structure n'est pas pleine on passe à l'octet suivant
-                else {                                                          // Quand elle est pleine
-                    byteCount = 0;                                              // On réinitialise
-                    PIXY_state = begin;                                         // On retourne à l'aiguillage
-                    // On calcule la somme de contrôle
-                    somme = Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.signature + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.x + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.y + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.width + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.height + Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.angle;
-
-                    if (somme == Pixy_CCFIFO[PIXY_wCCObjet].CCbloc.checksum) {  // Si le checksum est bon
-                        if (PIXY_wCCObjet < 19)     PIXY_wCCObjet++;            // On incrémente le pointeur d'écriture dans la FIFO CCObjet
-                        else                        PIXY_wCCObjet = 0;
-                        if (PIXY_nbCCObjet < 19)    PIXY_nbCCObjet++;           // On dit que l'on a un objet CC de plus à traiter
-                        else                        FlagPixyOverflow = 1;       // Si on a plus de 20 CC objets (en attente) => Overflow
-                    }
-                }
-                break;
-
-            case doubleZero :                                                   // Si on a reçu le code de début d'une nouvelle trame.
-
-                msgBuffer.tab[byteCount%2] = Pixy.getc();                       // on stocke les octets reçus
-                byteCount++;
-                if (byteCount == 2) {                                           // Quand on a 2 octets
-                    if (msgBuffer.mot == 0xaa55) {                              // On doit impérativement trouver le code 0xAA55
-                        PIXY_state = begin;                                     // Si c'est le cas, alors tout va bien et on va à l'aiguillage
-                        Pixy_NMObjet = PIXY_nbNMObjet;                          // On met à jour les variables pour le traitement
-                        Pixy_CCObjet = PIXY_nbCCObjet;
-                        PIXY_nbCCObjet = 0;
-                        PIXY_nbNMObjet = 0;
-                        FlagPixy = 1;                                           // On valide le traitement de la trame précédente.
-                    } else {                                                    // Si on trouve autre chose
-                        PIXY_synced = 0;                                        // C'est qu'on est perdu donc plus synchronisé.
-                        PIXY_state = none;                                      // Ceinture et bretelle
-                    }
-                    byteCount = 0;
-                }
-                break;
-        }
-    }
-}
-
+#include "include_define_typedeflibrary.h"
+#include "function_library.h"
 
 int main()
 {
@@ -451,12 +28,23 @@
     double      BOUSSOLE_periode;
 
     double      CAP_I2C, CAP_PWM;
-    double      SD1_val, SD2_val, LD1_val, LD2_val, CNY1_val, CNY2_val, CNY3_val, Vbat_val;
-    double      SD1_dist, SD2_dist, LD1_dist, LD2_dist;
+    double      CNY1_val, CNY2_val, CNY3_val, Vbat_val;
+    double      SD2_dist, LD2_dist;
 
     int         MOTG_evol = 1, MOTD_evol = 1;
     double      MOTG_duty = 0.5, MOTD_duty = 0.5;
 
+    //Variables Automate
+    int etat_actuel = 0, etat_futur = 0, etat_precedent = 0; //Need etat_precedent ?
+    
+    //Variables test capteurs
+    int ball_found = 0, ball_forward = 0, ball_captured = 0, face_ennemy_side = 0, face_our_side = 0;
+    int wall = 0, white_line_crossed = 0, return_done = 0, rotation_done; //Rename white_line_crossed
+
+    //Variables
+    
+    int orientation_camp_adversaire, orientation_mon_camp;
+
     times.reset();
     times.start();
 
@@ -508,384 +96,130 @@
 
     Servo.period_ms (20);
     Servo.pulsewidth_us(200);
-
+    
     while(1) {
 
-        do {
-            Led1 = 0;
-            Pc.printf ("\n\n\n\n\rProgramme de test\n\n\rEntrez le code du test a effectuer :\n\n");
-            Pc.printf ("\r1- Capteurs Ultra Son (les 3)\n");
-            Pc.printf ("\r2- Boussole et I2C\n");
-            Pc.printf ("\r3- Capteurs GP2 (les 4)\n");
-            Pc.printf ("\r4- Capteurs CNY70 (les 3)\n");
-            Pc.printf ("\r5- VBAT \t! erreur de composant la mesure est fausse !\n");
-            Pc.printf ("\r6- Moteur Gauche\n");
-            Pc.printf ("\r7- Moteur Droit\n");
-            Pc.printf ("\r8- Servomoteur\n");
-            Pc.printf ("\r9- PIXY (CMUCAM5)\n");
-            MENU_choix = Pc.getc ();
-        } while (((MENU_choix-'0')<1) || ((MENU_choix-'0')>9));
-
-        switch (MENU_choix-'0') {
-
-            case 1 :
-                Pc.printf ("\n\n\rTest des captreurs Ultrason\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-                do {
-
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-                    }
-
-                    // Gestion des US
-                    if (((Tick%150)==0) && FlagTick) {
-                        Trig1 = 1;
-                        wait_us(20);
-                        Trig1 = 0;
-                        FlagTick = 0;
-                    }
-
-                    if (((Tick%150)==50) && FlagTick) {
-                        Trig2 = 1;
-                        wait_us(20);
-                        Trig2 = 0;
-                        FlagTick = 0;
-                    }
-
-                    if (((Tick%150)==100) && FlagTick) {
-                        Trig3 = 1;
-                        wait_us(20);
-                        Trig3 = 0;
-                        FlagTick = 0;
-                    }
-
-                    if (FlagUS1==1) {
-                        Pc.printf ("\rUS 1 = %04d mm", (int)DistUS1);
-                        FlagUS1 = 0;
-                    }
-
-                    if (FlagUS2==1) {
-                        Pc.printf ("\r\t\t\tUS 2 = %04d mm", (int)DistUS2);
-                        FlagUS2 = 0;
-                    }
-
-                    if (FlagUS3==1) {
-                        Pc.printf ("\r\t\t\t\t\t\tUS 3 = %04d mm", (int)DistUS3);
-                        FlagUS3 = 0;
-                    }
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+        //capteurs_read(); //Lecture tous les capteurs
+        CAP_PWM = ((PWMB.pulsewidth()*1000)-1)*10;
+        Pc.printf ("\r PWM = %4.1lf", CAP_PWM);
+        //capteurs_test(); //Teste les valeurs des capteurs et change des variables booleenne 
+        etat_actuel = etat_futur;
+        
+        switch(etat_actuel) {
+            case START:
+                etat_futur = STOP_RETURN;
+                break;
+            
+            case SEEK_BALL:
+                if(ball_found) etat_futur = TURN_TO_BALL;
+                if(!ball_found) etat_futur = SEEK_ROTATION;
+                break;
+                
+            case SEEK_ROTATION:
+                if(rotation_done) etat_futur = SEEK_BALL;
+                
+            case TURN_TO_BALL:
+                if(ball_forward) etat_futur = GO_TO_BALL;
+                break;
+            
+            case GO_TO_BALL:
+                if(!ball_forward) etat_futur = TURN_TO_BALL;
+                if(ball_captured & face_ennemy_side) etat_futur = BALL_LAUNCHING;
+                if(ball_captured & !face_ennemy_side) etat_futur = CAPTURE_AND_TURN;
                 break;
-
-            case 2 :
-                Pc.printf ("\n\n\rBoussole\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-
-                Pc.printf ("\n\rVerif du bus I2C :");
-                I2C_check = Bus_I2C.write (BOUSSOLE_adress,BOUSSOLE_status,1,false);
-                if (I2C_check==0) {
-                    Pc.printf (" OK\n");
-                    Bus_I2C.write(BOUSSOLE_adress,BOUSSOLE_status, 1, true);
-                    Bus_I2C.read (BOUSSOLE_adress,I2C_registerValue,4);
-                    Pc.printf ("\rVersion Firmware boussole : %03d\n", I2C_registerValue[0]);
-                } else {
-                    Pc.printf (" FAIL\n");
-                }
-
-                BOUSSOLE_periode = PWMB.period();
-                Pc.printf ("\rVerif de la PWM :");
-                if ((BOUSSOLE_periode > 0.11) || (BOUSSOLE_periode < 0.06)) {
-                    Pc.printf (" FAIL\n\n");
-                } else {
-                    Pc.printf (" OK\n\n");
-                    BOUSSOLE_check = 0;
-                }
-
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-                    }
-
-                    if (((Tick%150)==0) && FlagTick) {
-                        FlagTick = 0;
-                        if (BOUSSOLE_check==0) {
-                            CAP_PWM = ((PWMB.pulsewidth()*1000)-1)*10;
-                            Pc.printf ("\r PWM = %4.1lf", CAP_PWM);
-                        }
-                        if (I2C_check==0) {
-                            Bus_I2C.write(BOUSSOLE_adress,BOUSSOLE_status, 1, true);
-                            Bus_I2C.read (BOUSSOLE_adress,I2C_registerValue,4);
-                            CAP_I2C = (double)(((unsigned short)I2C_registerValue[2]<<8)+(unsigned short)I2C_registerValue[3])/10.0;
-                            Pc.printf ("\r\t\t I2C = %4.1lf", CAP_I2C);
-                        }
-                    }
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+            
+            case CAPTURE_AND_TURN:
+                if(face_ennemy_side) etat_futur = RELEASE_CAPTURE;
+                break;                
+                
+            case WALL_CAPTURE_AND_TURN:
+                if(!wall & face_ennemy_side) etat_futur = RELEASE_CAPTURE;
+                break;
+            
+            case RELEASE_CAPTURE:
+                etat_futur = BALL_LAUNCHING;
                 break;
-
-            case 3 :
-                Pc.printf ("\n\n\rGP2xx\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-
-                        SD1_val = SD1;
-                        SD2_val = SD2;
-                        LD1_val = LD1;
-                        LD2_val = LD2;
-
-                        if (SD1_val < 0.06) {
-                            SD1_val = 0;
-                            SD1_dist = 40;
-                        } else {
-                            SD1_dist = 11.611/(SD1_val*3.3-0.0237);
-                            if (SD1_dist > 40) SD1_dist = 40;
-                        }
-
-                        if (SD2_val < 0.06) {
-                            SD2_val = 0;
-                            SD2_dist = 40;
-                        } else {
-                            SD2_dist = 11.611/(SD2_val*3.3-0.0237);
-                            if (SD2_dist > 40) SD2_dist = 40;
-                        }
-
-                        if (LD1_val < 0.1) {
-                            LD1_val = 0;
-                            LD1_dist = 150;
-                        } else {
-                            LD1_dist = 59.175/(LD1_val*3.3-0.0275);
-                            if (LD1_dist > 150) LD1_dist = 150;
-                        }
-
-                        if (LD2_val < 0.1) {
-                            LD2_val = 0;
-                            LD2_dist = 150;
-                        } else {
-                            LD2_dist = 59.175/(LD2_val*3.3-0.0275);
-                            if (LD2_dist > 150) LD2_dist = 150;
-                        }
-
-                        Pc.printf ("\r SD1 = %3.1lf cm - SD2 = %3.1lf cm - LD1 = %4.1lf cm - LD2 = %4.1lf cm", SD1_dist, SD2_dist, LD1_dist, LD2_dist);
-                    }
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+            
+            case BALL_LAUNCHING:
+                if(wall) etat_futur = WALL_CAPTURE_AND_TURN ;
+                if(white_line_crossed) etat_futur = STOP_BALL_LAUNCHING;
+                break;
+            
+            case STOP_BALL_LAUNCHING: //Add tempo ?
+                etat_futur = TURN_TO_BASE;
                 break;
-
-            case 4 :
-                Pc.printf ("\n\n\rCNY70\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-
-                        CNY1_val = CNY1;
-                        CNY2_val = CNY2;
-                        CNY3_val = CNY3;
-
-                        Pc.printf ("\r CNY1 = %3.2lf V\t CNY2 = %3.2lf V\t CNY3 = %3.2lf V", CNY1_val*3.3, CNY2_val*3.3, CNY3_val*3.3);
-                    }
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+            
+            case TURN_TO_BASE:
+                if(face_our_side) etat_futur = RETURN;
+                break;
+                
+            case RETURN: //return_done is a tempo ?
+                if(return_done) etat_futur = STOP_RETURN;
+                else if(wall) etat_futur = WALL_RETURN;
                 break;
-
-            case 5 :
-                Pc.printf ("\n\n\rVbat\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-
-                        Vbat_val = Vbat;
-                        Pc.printf ("\rVbat = %5.3lf V", Vbat_val*3.3*4.3);
-                    }
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+                
+            case WALL_RETURN:
+                if(!wall) etat_futur = STOP_RETURN;
+                break;
+                    
+            case STOP_RETURN:
+                etat_futur = SEEK_BALL;
+                break;
+            
+            default :
+                etat_futur = STOP_RETURN;
                 break;
-
-            case 6 :
-                Pc.printf ("\n\n\rMoteur Gauche\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-
-                En = 1;
-                SensG = 1;
-                Led2 = 1;
-                MOTG_duty = 0.5;
-                MOTG_evol = 1;
-                Pwm_MG = 0.5;
-
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-                    }
-                    if (BPPressed) {
-                        BPPressed = 0;
-                        SensG = !SensG;
-                        Led2 = !Led2;
-                    }
-
-                    if (((Tick%1000)==0) && FlagTick) {
-                        FlagTick = 0;
-                        if (MOTG_evol) {
-                            if (MOTG_duty < 0.9) MOTG_duty += 0.1;
-                            else {
-                                MOTG_evol = 0;
-                                MOTG_duty = 0.9;
-                            }
-                        } else {
-                            if (MOTG_duty > 0.1) MOTG_duty -= 0.1;
-                            else {
-                                MOTG_evol = 1;
-                                MOTG_duty = 0.1;
-                            }
-                        }
-                    }
-
-                    Pwm_MG = MOTG_duty;
-                    Pc.printf ("\rPWM = %2.1lf => Pos = %10ld Tick, Period = %ldus", MOTG_duty, Gauche.GetCounter(), Gperiod);
-
-
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
-
-                En = 0;
-                if (SensG == 0) Pwm_MG = 0;
-                else            Pwm_MG = 1;
-
+        }
+        
+        switch(etat_actuel) {
+            case START:
+                orientation_camp_adversaire = (int)CAP_PWM;
+                orientation_mon_camp =(((int)CAP_PWM+180)%360);
+                break;
+            
+            case SEEK_BALL:
+                break;
+            
+            case TURN_TO_BALL:
+                break;
+            
+            case GO_TO_BALL:
+                //Avancer droit (ralentir a la fin)
                 break;
-
-            case 7 :
-                Pc.printf ("\n\n\rMoteur Droit\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-
-                En = 1;
-                SensD = 1;
-                Led2 = 1;
-                MOTD_duty = 0.5;
-                MOTD_evol = 1;
-                Pwm_MD = 0.5;
-
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-                    }
-                    if (BPPressed) {
-                        BPPressed = 0;
-                        SensD = !SensD;
-                        Led2 = !Led2;
-                    }
-
-                    if (((Tick%1000)==0) && FlagTick) {
-                        FlagTick = 0;
-                        if (MOTD_evol) {
-                            if (MOTD_duty < 0.9) MOTD_duty += 0.1;
-                            else {
-                                MOTD_evol = 0;
-                                MOTD_duty = 0.9;
-                            }
-                        } else {
-                            if (MOTD_duty > 0.1) MOTD_duty -= 0.1;
-                            else {
-                                MOTD_evol = 1;
-                                MOTD_duty = 0.1;
-                            }
-                        }
-                    }
-                    Pwm_MD = MOTD_duty;
-                    Pc.printf ("\rPWM = %2.1lf => Pos = %10ld Tick, Period = %ldus", MOTD_duty, Droite.GetCounter(), Dperiod);
-
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
-
-                En = 0;
-                if (SensD == 0) Pwm_MD = 0;
-                else            Pwm_MD = 1;
-
+            
+            case CAPTURE_AND_TURN:
+                //Baisser cage
+                //Tourner
+                //-------------------->Separer etapes ?
+                break;
+            
+            case RELEASE_CAPTURE:
+                //Lever cage
+                break;
+            
+            case BALL_LAUNCHING:
+                //Avancer droit a fond
                 break;
-
-            case 8 :
-                Pc.printf ("\n\n\rServo Moteur\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-
-                do {
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-                    }
-
-                    if (((Tick%250)==0) && FlagTick) {
-                        FlagTick = 0;
-                        if (SERVO_dir == S_monte) {
-                            if (SERVO_pulseWidth < (SERVO_max - 100))   SERVO_pulseWidth +=100;
-                            else {
-                                SERVO_dir = S_descente;
-                                SERVO_pulseWidth = SERVO_max;
-                            }
-                        } else {
-                            if (SERVO_pulseWidth > (SERVO_min + 100))   SERVO_pulseWidth -=100;
-                            else {
-                                SERVO_dir = S_monte;
-                                SERVO_pulseWidth = SERVO_min;
-                            }
-                        }
-
-                        Servo.pulsewidth_us (SERVO_pulseWidth);
-                        Pc.printf ("\rPulse = %d",SERVO_pulseWidth);
-                    }
-
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+            
+            case STOP_BALL_LAUNCHING:
+                //Arreter
+                
+                break;
+            
+            case TURN_TO_BASE:
+                //Faire demi tour
                 break;
-
-            case 9 :
-                Pc.printf ("\n\n\rPixy\n");
-                Pc.printf ("\rAppuyez sur Entree pour quitter\n");
-
-                if (Pixy_check == 0)    Pc.printf ("\n\rPIXY is ALIVE\n");
-                else                    Pc.printf ("\n\rPIXY don't talk\n");
-
-                do {
-                    if (FlagPixy) {
-
-                        if (FlagPixyOverflow) {
-                            Pc.printf ("\rSome Data were lost\n");
-                            FlagPixyOverflow = 0;
-                        }
-                        for (PIXY_objet = 0; PIXY_objet < Pixy_NMObjet; PIXY_objet++) {
-                            Pc.printf ("\rNMobj #%hd/%hd : sig = %hd : X=%5hd, Y=%5hd (W=%5hd, H=%5hd)\n", PIXY_objet+1, Pixy_NMObjet, Pixy_NMFIFO[PIXY_rNMObjet].NMbloc.signature, Pixy_NMFIFO[PIXY_rNMObjet].NMbloc.x, Pixy_NMFIFO[PIXY_rNMObjet].NMbloc.y, Pixy_NMFIFO[PIXY_rNMObjet].NMbloc.width, Pixy_NMFIFO[PIXY_rNMObjet].NMbloc.height);
-
-                            if (PIXY_rNMObjet<19)   PIXY_rNMObjet++;
-                            else                    PIXY_rNMObjet = 0;
-                        }
-                        Pixy_NMObjet = 0;
-
-                        for (PIXY_objet = 0; PIXY_objet < Pixy_CCObjet; PIXY_objet++) {
-                            Pc.printf ("\rCCobj #%hd/%hd : sig = %hd : X=%5hd, Y=%5hd (W=%5hd, H=%5hd)\n", PIXY_objet+1, Pixy_CCObjet, Pixy_CCFIFO[PIXY_rCCObjet].CCbloc.signature, Pixy_CCFIFO[PIXY_rCCObjet].CCbloc.x, Pixy_CCFIFO[PIXY_rCCObjet].CCbloc.y, Pixy_CCFIFO[PIXY_rCCObjet].CCbloc.width, Pixy_CCFIFO[PIXY_rCCObjet].CCbloc.height);
-
-                            if (PIXY_rCCObjet<19)   PIXY_rCCObjet++;
-                            else                    PIXY_rCCObjet = 0;
-                        }
-                        Pixy_CCObjet = 0;
-                        Pc.printf("\n\r");
-                        FlagPixy = 0;
-                    }
-
-                    if (FlagTickLed) {
-                        Led1 = !Led1;
-                        FlagTickLed = 0;
-                    }
-                } while(!Pc.readable());
-                MENU_choix = Pc.getc();
+                
+            case RETURN:
+                //Avancer pendant x secondes
                 break;
-
+                
+            case STOP_RETURN:
+                //S'arreter
+                break;
+                        
+            default :
+                break;
         }
     }
 }
\ No newline at end of file