Theo Le Paih / Mbed 2 deprecated Lib_Pixy2

Dependencies:   mbed

Revision:
18:190e3987e274
Parent:
16:f84b0f970c3e
Child:
19:007d361c8d66
diff -r 4f901906d86c -r 190e3987e274 pixy2.cpp
--- a/pixy2.cpp	Tue Mar 12 18:31:22 2019 +0000
+++ b/pixy2.cpp	Wed Mar 13 16:27:14 2019 +0000
@@ -5,7 +5,6 @@
     _Pixy2 = new Serial (tx, rx, debit);
     _Pixy2->attach (callback(this,&PIXY2::pixy2_getByte));
     etat = idle;
-    rPointer = 0;
     Pixy2_buffer = (Byte*) malloc (0x100);
 }
 
@@ -23,46 +22,41 @@
 
 void PIXY2::pixy2_getByte ()    // Interruption de la pixy2
 {
-    static Byte             startPoint;
     T_Word                  *buffer;
     
-    Pixy2_buffer[wPointer] = _Pixy2->getc();                                        // On stocke l'octet reçu dans la première case dispo du tableau temporaire
-    wPointer++;
+    Pixy2_buffer[wPointer] = _Pixy2->getc();                                        // On stocke l'octet reçu dans la première case dispo du buffer de réception
     
     switch (etat) {
         case messageSent :                                                          // Si on a envoyé une requete => on attend un entête
-            if ( (wPointer - rPointer) >= 2) {                                      // On attend d'avoir reçu 2 octets
-                startPoint = wPointer - 1;
-                buffer = (T_Word*) &Pixy2_buffer[startPoint];                       //On pointe la structure sur les 2 derniers octets reçus
-                if ((buffer->mot == PIXY2_CSSYNC) || (buffer->mot == PIXY2_SYNC)) {
+            if (wPointer > 0) {                                                     // On attend d'avoir reçu 2 octets
+                buffer = (T_Word*) &Pixy2_buffer[wPointer-1];                       // On pointe la structure sur les 2 derniers octets reçus
+                if ((buffer->mot == PIXY2_CSSYNC) || (buffer->mot == PIXY2_SYNC)) { // Si c'est un mot d'entête
                     etat = receivingHeader;                                         // On passe à l'état réception de l'entête
-                    rPointer = startPoint;
-                    if (buffer->mot == PIXY2_SYNC)      frameContainChecksum = 0;   // On mémorise qu'il n'y a pas de checksum à vérifier
-                    else                                frameContainChecksum = 1;   // On mémorise qu'il y a un checksum à vérifier
+                    hPointer = wPointer - 1;                                        // On initialise le pointeur de l'entête
+                    if (buffer->mot == PIXY2_SYNC)      frameContainChecksum = 0;   // Si c'est un entête sans checksum, on mémorise qu'il n'y a pas de checksum à vérifier
+                    else                                frameContainChecksum = 1;   // Sinon, on mémorise qu'il y a un checksum à vérifier
                 }
             }
             break;
 
-        case receivingHeader :                                                      //Si on est en train de recevoir un entête (entre le SYNC et... La fin de l'entête)
-            if ((frameContainChecksum && ((wPointer - rPointer) == PIXY2_CSHEADERSIZE)) || (!frameContainChecksum && ((wPointer - rPointer) == PIXY2_NCSHEADERSIZE))) {
-                //Si on a reçu 6 octets pour une trame avec checksum ou 4 pour une trame sans checksum
-                etat = headerReceived;                                              //On passe à entête reçu
-                dataSize = Pixy2_buffer[startPoint+3];                              // Et on lit la taille de la payload
+        case receivingHeader :                                                      // Si on est en train de recevoir un entête (entre le SYNC et... La fin de l'entête)
+            if ((frameContainChecksum && ((wPointer - hPointer) == PIXY2_CSHEADERSIZE-1)) || (!frameContainChecksum && ((wPointer - hPointer) == PIXY2_NCSHEADERSIZE-1))) {
+                                                                                    // Si on a reçu 6 octets pour une trame avec checksum ou 4 pour une trame sans checksum, c'est à dire un entête complet
+                etat = receivingData;                                               // On dit que l'on va de recevoir des données
+                dataSize = Pixy2_buffer[hPointer+3];                                // On enregistre la taille de la payload
+                dPointer = wPointer + 1;                                            // Et on sauvegarde le point de départ de la zone de données
             }
             break;
 
-        case headerReceived :                                                       // Si on vient de recevoir le premier octet de données
-            startPoint = wPointer;                                                  // On enregistre sa position
-            etat = receivingData;                                                   // Et on dit que l'on est en train de recevoir des données
-            break;
-
         case receivingData :                                                        // Si on est en train de recevoir des données.
-            if (wPointer == (dataSize + startPoint)) etat = dataReceived;           //Quand on a reçu toutes les données promises on dit que c'est OK
+            if (wPointer == ((dataSize - 1) + dPointer)) etat = dataReceived;       // Quand on a reçu toutes les données promises on dit que c'est OK
             break;
 
         default : // On ne traite volontairement ici pas tous les cas, en particulier idle et dataReceived. C'est à la fonction de le faire ! Le reste est lié à des réceptions de données.
             break;
     }
+    wPointer++;                                                                     // on pointe la case suivante du buffer de réception 
+
 }
 
 T_pixy2ErrorCode PIXY2::pixy2_sndGetVersion (void){
@@ -70,7 +64,7 @@
     int                 i = 0, dataSize = 0;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_ASK_VERS;
-    msg.frame.header.pixLength = 0;
+    msg.frame.header.pixLength = dataSize;
     do {
         while(!_Pixy2->writable());
         _Pixy2->putc(msg.data[i]);
@@ -84,7 +78,7 @@
     int                 i = 0, dataSize = 1;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_ASK_RESOL;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = 0;
     do {
         while(!_Pixy2->writable());
@@ -99,7 +93,7 @@
     int                 i = 0, dataSize = 1;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_BRIGHT;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = brightness;
     do {
         while(!_Pixy2->writable());
@@ -115,7 +109,7 @@
     T_Word              tmp;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_SERVOS;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     tmp.mot = s0;
     msg.frame.data[0] = tmp.octet[0];
     msg.frame.data[1] = tmp.octet[1];
@@ -135,7 +129,7 @@
     int                 i = 0, dataSize = 3;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_LED;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = red;
     msg.frame.data[1] = green;
     msg.frame.data[2] = blue;
@@ -152,7 +146,7 @@
     int                 i = 0, dataSize = 2;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_LED;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = upper;
     msg.frame.data[1] = lower;
     do {
@@ -168,7 +162,7 @@
     int                 i = 0, dataSize = 0;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_ASK_FPS;
-    msg.frame.header.pixLength = 0;
+    msg.frame.header.pixLength = dataSize;
     do {
         while(!_Pixy2->writable());
         _Pixy2->putc(msg.data[i]);
@@ -182,7 +176,7 @@
     int                 i = 0, dataSize = 2;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_ASK_BLOC;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = sigmap;
     msg.frame.data[1] = maxBloc;
     do {
@@ -198,7 +192,7 @@
     int                 i = 0, dataSize = 2;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_ASK_LINE;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = type;
     msg.frame.data[1] = feature;
     do {
@@ -214,7 +208,7 @@
     int                 i = 0, dataSize = 1;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_MODE;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = mode;
     do {
         while(!_Pixy2->writable());
@@ -231,7 +225,7 @@
     tmp.mot = angle;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_TURN;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     tmp.mot = angle;
     msg.frame.data[0] = tmp.octet[0];
     msg.frame.data[1] = tmp.octet[1];
@@ -250,7 +244,7 @@
     tmp.mot = angle;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_DEFTURN;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     tmp.mot = angle;
     msg.frame.data[0] = tmp.octet[0];
     msg.frame.data[1] = tmp.octet[1];
@@ -267,7 +261,7 @@
     int                 i = 0, dataSize = 1;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_VECTOR;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = vectorIndex;
     do {
         while(!_Pixy2->writable());
@@ -282,7 +276,7 @@
     int                 i = 0, dataSize = 0;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_SET_REVERSE;
-    msg.frame.header.pixLength = 0;
+    msg.frame.header.pixLength = dataSize;
     do {
         while(!_Pixy2->writable());
         _Pixy2->putc(msg.data[i]);
@@ -296,7 +290,7 @@
     int                 i = 0, dataSize = 3;
     msg.frame.header.pixSync = PIXY2_SYNC;
     msg.frame.header.pixType = PIXY2_ASK_VIDEO;
-    msg.frame.header.pixLength = 1;
+    msg.frame.header.pixLength = dataSize;
     msg.frame.data[0] = x;
     msg.frame.data[1] = y;
     msg.frame.data[2] = saturate;
@@ -313,43 +307,39 @@
 
 T_pixy2ErrorCode PIXY2::pixy2_getVersion (T_pixy2Version *version){
 
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
     T_pixy2ErrorCode    cr = PIXY2_OK;
     
     switch (etat) {
         case idle :                                                                 // Si la caméra est inactive
+            wPointer = 0;                                                           // On remonte en haut du buffer
             cr = PIXY2::pixy2_sndGetVersion();                                      // On envoie la trame de demande de la version
             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
             etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
             break;
             
         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
             if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_REP_VERS) {                           // On vérifie que la trame est du type convenable
-                        version = (T_pixy2Version*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On mappe le pointeur de version sur la donnée stockée dans la FIFO (ligne précédente)                        
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On copie le code d'erreur reçu dans la variable de retour
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if (msg->pixType == PIXY2_REP_VERS) {                           // On vérifie que la trame est du type convenable (REPONSE VERSION)
+                        version = (T_pixy2Version*) &Pixy2_buffer[dPointer];        // On mappe le pointeur de structure sur le buffer de réception.
+                    } else {                                                        // Si ce n'est pas le bon type
+                        if (msg->pixType == PIXY2_REP_ERROR) {                      // Cela pourrait être une trame d'erreur
+                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];      // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur de type.
                     }                                   
                 } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
             } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
                 if (msg->pixType == PIXY2_REP_VERS) {                               // On vérifie que la trame est du type convenable                               
-                    version = (T_pixy2Version*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
+                    version = (T_pixy2Version*) &Pixy2_buffer[dPointer];            // Si le type est bon, on mappe le pointeur de structure sur le buffer de réception.
                 } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On copie le code d'erreur reçu dans la variable de retour    
+                    if (msg->pixType == PIXY2_REP_ERROR) {                          // Si on reçoit une trame d'erreur
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // On copie le code d'erreur reçu dans la variable de retour
                     }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur
                 }
             }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
+            etat = idle;                                                            // On annoce que la pixy est libre
             break;
 
         default :                                                                   // Dans tous les autres cas
@@ -361,43 +351,115 @@
 
 T_pixy2ErrorCode PIXY2::pixy2_getResolution (T_pixy2Resolution *resolution){
 
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
     T_pixy2ErrorCode    cr = PIXY2_OK;
     
     switch (etat) {
         case idle :                                                                 // Si la caméra est inactive
+            wPointer = 0;                                                           // On remonte en haut du buffer
             cr = PIXY2::pixy2_sndGetResolution();                                   // On envoie la trame de demande de la résolution
             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
             etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
             break;
             
         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
             if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_REP_RESOL) {                          // On vérifie que la trame est du type convenable
-                        resolution = (T_pixy2Resolution*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // Si le checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On copie le code d'erreur reçu dans la variable de retour
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if (msg->pixType == PIXY2_REP_RESOL) {                          // On vérifie que la trame est du type convenable (REPONSE RESOLUTION)
+                        resolution = (T_pixy2Resolution*) &Pixy2_buffer[dPointer];  // On mappe le pointeur de structure sur le buffer de réception.
+                    } else {                                                        // Si ce n'est pas le bon type
+                        if (msg->pixType == PIXY2_REP_ERROR) {                      // Cela pourrait être une trame d'erreur
+                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];      // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur de type.
                     }                                   
                 } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
             } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
-                if (msg->pixType == PIXY2_REP_RESOL) {                              // On vérifie que la trame est du type convenable                               
-                    resolution = (T_pixy2Resolution*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
+                if (msg->pixType == PIXY2_REP_RESOL) {                              // On vérifie que la trame est du type convenable (REPONSE RESOLUTION)                               
+                    resolution = (T_pixy2Resolution*) &Pixy2_buffer[dPointer];      // Si le type est bon, on mappe le pointeur de structure sur le buffer de réception.
                 } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On copie le code d'erreur reçu dans la variable de retour    
+                    if (msg->pixType == PIXY2_REP_ERROR) {                          // Si on reçoit une trame d'erreur
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // On copie le code d'erreur reçu dans la variable de retour
                     }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur
                 }
             }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
+            etat = idle;                                                            // On annoce que la pixy est libre
+            break;
+
+        default :                                                                   // Dans tous les autres cas
+            cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
+            break;
+    }
+    return cr;
+}
+
+T_pixy2ErrorCode PIXY2::pixy2_setCameraBrightness (Byte brightness){
+
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
+    T_pixy2ErrorCode    cr = PIXY2_OK;
+    
+    switch (etat) {
+        case idle :                                                                 // Si la caméra est inactive
+            wPointer = 0;                                                           // On remonte en haut du buffer
+            cr = PIXY2::pixy2_sndSetCameraBrightness (brightness);                  // On envoie la trame de règlage de la luminosité
+            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
+            etat = messageSent;                                                     // On passe à l'attente du message de réponse
+            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
+            break;
+            
+        case dataReceived :                                                         // Quand on a reçu l'intégralité du message
+            if (frameContainChecksum) {                                             // Si la trame contient un checksum
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                    }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur de type.
+                } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
+            } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
+                if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                    cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                }else cr = PIXY2_TYPE_ERROR;                                        // Si le type ne correspond à rien de normal on signale une erreur de type.
+            }
+            etat = idle;                                                            // On annoce que la pixy est libre
+            break;
+
+        default :                                                                   // Dans tous les autres cas
+            cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
+            break;
+    }
+    return cr;
+}
+
+T_pixy2ErrorCode PIXY2::pixy2_setServos (Word s0, Word s1){
+
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
+    T_pixy2ErrorCode    cr = PIXY2_OK;
+    
+    switch (etat) {
+        case idle :                                                                 // Si la caméra est inactive
+            wPointer = 0;                                                           // On remonte en haut du buffer
+            cr = PIXY2::pixy2_sndSetServo (s0, s1);                                 // On envoie la trame de règlage des servos moteurs
+            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
+            etat = messageSent;                                                     // On passe à l'attente du message de réponse
+            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
+            break;
+            
+        case dataReceived :                                                         // Quand on a reçu l'intégralité du message
+            if (frameContainChecksum) {                                             // Si la trame contient un checksum
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                    }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur de type.
+                } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
+            } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
+                if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                    cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                }else cr = PIXY2_TYPE_ERROR;                                        // Si le type ne correspond à rien de normal on signale une erreur de type.
+            }
+            etat = idle;                                                            // On annoce que la pixy est libre
             break;
 
         default :                                                                   // Dans tous les autres cas
@@ -407,161 +469,39 @@
     return cr;
 }
 
-
-T_pixy2ErrorCode PIXY2::pixy2_setCameraBrightness (Byte brightness){
+T_pixy2ErrorCode PIXY2::pixy2_setLED (Byte red, Byte green, Byte blue){
 
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
     T_pixy2ErrorCode    cr = PIXY2_OK;
-    T_pixy2ReturnCode   retour;
     
     switch (etat) {
         case idle :                                                                 // Si la caméra est inactive
-            cr = PIXY2::pixy2_sndSetCameraBrightness (brightness);                  // On envoie la trame de règlage de la luminosité
+            wPointer = 0;                                                           // On remonte en haut du buffer
+            cr = PIXY2::pixy2_sndSetLED (red, green, blue);                         // On envoie la trame de règlage des composantes de la LED RGB
             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
             etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
-            break;
-            
-        case dataReceived :                                                         // Quand on a reçu l'intégralité du message
-            if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_ACK) {                                // On vérifie que la trame est du type convenable
-                        retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // Si le checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                        if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
-                    }                                   
-                } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
-            } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
-                if (msg->pixType == PIXY2_ACK) {                                    // On vérifie que la trame est du type convenable                               
-                    retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                    if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                   }else cr = PIXY2_TYPE_ERROR;                                     // Si le type ne correspond à rien de normal on signale une erreur
-                }
-            }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
-            break;
-
-        default :                                                                   // Dans tous les autres cas
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
-            break;
-    }
-    return cr;
-}
-
-T_pixy2ErrorCode PIXY2::pixy2_setServos (Word s0, Word s1){
-
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
-    T_pixy2ErrorCode    cr = PIXY2_OK;
-    T_pixy2ReturnCode   retour;
-    
-    switch (etat) {
-        case idle :                                                                 // Si la caméra est inactive
-            cr = PIXY2::pixy2_sndSetServo (s0, s1);                                 // On envoie la trame de règlage des servos moteurs
-            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
-            etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
             break;
             
         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
             if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_ACK) {                                // On vérifie que la trame est du type convenable
-                        retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // Si le checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                        if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
-                    }                                   
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                    }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur de type.
                 } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
             } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
-                if (msg->pixType == PIXY2_ACK) {                                    // On vérifie que la trame est du type convenable                               
-                    retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                    if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                   }else cr = PIXY2_TYPE_ERROR;                                     // Si le type ne correspond à rien de normal on signale une erreur
-                }
+                if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                    cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                }else cr = PIXY2_TYPE_ERROR;                                        // Si le type ne correspond à rien de normal on signale une erreur de type.
             }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
+            etat = idle;                                                            // On annoce que la pixy est libre
             break;
 
         default :                                                                   // Dans tous les autres cas
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
-            break;
-    }
-    return cr;
-}
-
-T_pixy2ErrorCode PIXY2::pixy2_setLED (Byte red, Byte green, Byte blue){
-
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
-    T_pixy2ErrorCode    cr = PIXY2_OK;
-    T_pixy2ReturnCode   retour;
-    
-    switch (etat) {
-        case idle :                                                                 // Si la caméra est inactive
-            cr = PIXY2::pixy2_sndSetLED (red, green, blue);                         // On envoie la trame de règlage des composantes de la LED RGB
-            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi
-            etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
-            break;
-            
-        case dataReceived :                                                         // Quand on a reçu l'intégralité du message
-            if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_ACK) {                                // On vérifie que la trame est du type convenable
-                        retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // Si le checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                        if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
-                    }                                   
-                } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
-            } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
-                if (msg->pixType == PIXY2_ACK) {                                    // On vérifie que la trame est du type convenable                               
-                    retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                    if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                   }else cr = PIXY2_TYPE_ERROR;                                     // Si le type ne correspond à rien de normal on signale une erreur
-                }
-            }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
-            break;
-
-        default :                                                                   // Dans tous les autres cas
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
+            cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
             break;
     }
     return cr;
@@ -569,52 +509,37 @@
 
 T_pixy2ErrorCode PIXY2::pixy2_setLamp (Byte upper, Byte lower){
 
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
     T_pixy2ErrorCode    cr = PIXY2_OK;
-    T_pixy2ReturnCode   retour;
     
     switch (etat) {
         case idle :                                                                 // Si la caméra est inactive
+            wPointer = 0;                                                           // On remonte en haut du buffer
             cr = PIXY2::pixy2_sndSetLamp (upper, lower);                            // On envoie la trame de règlage d'allumage des lumières de contraste
-            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi
+            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
             etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
             break;
             
         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
             if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_ACK) {                                // On vérifie que la trame est du type convenable
-                        retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // Si le checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                        if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
-                    }                                   
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                    }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur de type.
                 } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
             } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
-                if (msg->pixType == PIXY2_ACK) {                                    // On vérifie que la trame est du type convenable                               
-                    retour = *(T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                    if (retour.pixReturn != PIXY2_OK) cr = (T_pixy2ErrorCode) retour.pixReturn;
-                                                                                    // Si la Pixy n'aquite pas l'ordre, on retourne l'erreur signalée
-                } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                   }else cr = PIXY2_TYPE_ERROR;                                     // Si le type ne correspond à rien de normal on signale une erreur
-                }
+                if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
+                                                                                    // On vérifie que la trame est du type convenable (ACK ou ERREUR)
+                    cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                }else cr = PIXY2_TYPE_ERROR;                                        // Si le type ne correspond à rien de normal on signale une erreur de type.
             }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
+            etat = idle;                                                            // On annoce que la pixy est libre
             break;
 
         default :                                                                   // Dans tous les autres cas
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
+            cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
             break;
     }
     return cr;
@@ -622,53 +547,94 @@
 
 T_pixy2ErrorCode PIXY2::pixy2_getFPS (T_pixy2ReturnCode *framerate){
 
-    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer];
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
     T_pixy2ErrorCode    cr = PIXY2_OK;
     
     switch (etat) {
         case idle :                                                                 // Si la caméra est inactive
-            cr = PIXY2::pixy2_sndGetFPS();                                          // On envoie la trame de règlage d'allumage des lumières de contraste
-            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi
+            wPointer = 0;                                                           // On remonte en haut du buffer
+            cr = PIXY2::pixy2_sndGetFPS();                                          // On envoie la trame de demande du Framerate
+            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
             etat = messageSent;                                                     // On passe à l'attente du message de réponse
-            rPointer = wPointer;                                                    // On enregistre la position du pointeur de FIFO
             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
             break;
             
         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
             if (frameContainChecksum) {                                             // Si la trame contient un checksum
-                if ( pixy2_validateChecksum (&Pixy2_buffer[rPointer]) ) {           // On lance la validation du checksum           
-                    if (msg->pixType == PIXY2_ACK) {                                // On vérifie que la trame est du type convenable
-                        framerate = (T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // Si le checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
-                    } else {
-                        if (msg->pixType == PIXY2_ERROR) {                          // Si on reçoit une trame d'erreur
-                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_CSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if (msg->pixType == PIXY2_REP_FPS) {                            // On vérifie que la trame est du type convenable (REPONSE FPS)
+                        framerate = (T_pixy2ReturnCode*) &Pixy2_buffer[dPointer];   // On mappe le pointeur de structure sur le buffer de réception.
+                    } else {                                                        // Si ce n'est pas le bon type
+                        if (msg->pixType == PIXY2_REP_ERROR) {                      // Cela pourrait être une trame d'erreur
+                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];      // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur de type.
                     }                                   
                 } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
             } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
-                if (msg->pixType == PIXY2_ACK) {                                    // On vérifie que la trame est du type convenable                               
-                    framerate = (T_pixy2ReturnCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // Si le type est bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente)                        
+                if (msg->pixType == PIXY2_REP_FPS) {                                // On vérifie que la trame est du type convenable (REPONSE FPS)                               
+                    framerate = (T_pixy2ReturnCode*) &Pixy2_buffer[dPointer];       // Si le type est bon, on mappe le pointeur de structure sur le buffer de réception.
                 } else {
-                    if (msg->pixType == PIXY2_ERROR) {                              // Si on reçoit une trame d'erreur
-                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[rPointer + PIXY2_NCSHEADERSIZE];
-                                                                                    // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente)    
-                   }else cr = PIXY2_TYPE_ERROR;                                     // Si le type ne correspond à rien de normal on signale une erreur
+                    if (msg->pixType == PIXY2_REP_ERROR) {                          // Si on reçoit une trame d'erreur
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // On copie le code d'erreur reçu dans la variable de retour
+                    }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur
                 }
             }
-            etat = idle;                                                            // Et on annoce que la pixy est libre
+            etat = idle;                                                            // On annoce que la pixy est libre
             break;
 
         default :                                                                   // Dans tous les autres cas
-            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
+            cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
             break;
     }
     return cr;
 }
 
-T_pixy2ErrorCode PIXY2::pixy2_getBlocks (Byte sigmap, Byte maxBloc){return PIXY2_OK;}
+T_pixy2ErrorCode PIXY2::pixy2_getBlocks (Byte sigmap, Byte maxBloc){
+
+    T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
+    T_pixy2ErrorCode    cr = PIXY2_OK;
+    
+    switch (etat) {
+        case idle :                                                                 // Si la caméra est inactive
+            wPointer = 0;                                                           // On remonte en haut du buffer
+            cr = PIXY2::pixy2_sndGetBlocks(sigmap, maxBloc);                        // On envoie la trame de demande de blocs de couleur
+            if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
+            etat = messageSent;                                                     // On passe à l'attente du message de réponse
+            cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
+            break;
+            
+        case dataReceived :                                                         // Quand on a reçu l'intégralité du message
+            if (frameContainChecksum) {                                             // Si la trame contient un checksum
+                if ( pixy2_validateChecksum (&Pixy2_buffer[hPointer]) ) {           // On lance la validation du checksum           
+                    if (msg->pixType == PIXY2_REP_BLOC) {                           // On vérifie que la trame est du type convenable (REPONSE BLOCS)
+                        Pixy2_blocks = (T_pixy2Bloc*) &Pixy2_buffer[dPointer];      // On mappe le pointeur de structure sur le buffer de réception.
+                        Pixy2_numBlocks = dataSize / sizeof(T_pixy2Bloc);           // On indique le nombre de blocs reçus           
+                    } else {                                                        // Si ce n'est pas le bon type
+                        if (msg->pixType == PIXY2_REP_ERROR) {                      // Cela pourrait être une trame d'erreur
+                            cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];      // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
+                        }else cr = PIXY2_TYPE_ERROR;                                // Si le type ne correspond à rien de normal on signale une erreur de type.
+                    }                                   
+                } else cr = PIXY2_BAD_CHECKSUM;                                     // Si le checksum est faux on retourne une erreur aussi !
+            } else {                                                                // S'il n'y a pas de checksum (pas normal mais on ne sait jamais)
+                if (msg->pixType == PIXY2_REP_BLOC) {                               // On vérifie que la trame est du type convenable (REPONSE BLOCS)                               
+                    Pixy2_blocks = (T_pixy2Bloc*) &Pixy2_buffer[dPointer];          // On mappe le pointeur de structure sur le buffer de réception.
+                    Pixy2_numBlocks = dataSize / sizeof(T_pixy2Bloc);               // On indique le nombre de blocs reçus           
+                } else {
+                    if (msg->pixType == PIXY2_REP_ERROR) {                          // Si on reçoit une trame d'erreur
+                        cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];          // On copie le code d'erreur reçu dans la variable de retour
+                    }else cr = PIXY2_TYPE_ERROR;                                    // Si le type ne correspond à rien de normal on signale une erreur
+                }
+            }
+            etat = idle;                                                            // On annoce que la pixy est libre
+            break;
+
+        default :                                                                   // Dans tous les autres cas
+            cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
+            break;
+    }
+    return cr;
+}
+
 T_pixy2ErrorCode PIXY2::pixy2_getMainFeature (Byte features){return PIXY2_OK;}
 T_pixy2ErrorCode PIXY2::pixy2_getAllFeature (Byte features){return PIXY2_OK;}
 T_pixy2ErrorCode PIXY2::pixy2_setMode (Byte mode){return PIXY2_OK;}