Theo Le Paih / Mbed 2 deprecated Lib_Pixy2

Dependencies:   mbed

Revision:
20:8e3adcaab290
Parent:
19:007d361c8d66
Child:
22:5f76404e2cbc
--- a/pixy2.cpp	Mon Apr 01 12:34:14 2019 +0000
+++ b/pixy2.cpp	Mon Apr 01 15:34:15 2019 +0000
@@ -892,8 +892,44 @@
     return cr;
 }
 
+T_pixy2ErrorCode PIXY2::pixy2_getRGB (Word x, Word y, Byte saturate, T_pixy2Pixel *pixel){
 
-T_pixy2ErrorCode PIXY2::pixy2_getRGB (Word x, Word y, Byte saturate, T_pixy2Pixel *pixel){return PIXY2_OK;}
+    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_sndGetRGB(x, y, saturate);                            // On envoie la trame de demande de la couleur (RGB) d'un carée de pixel
+            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
+                    return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
+                }
+            }
+            if (msg->pixType == PIXY2_REP_ACK) {                                    // On vérifie que la trame est du type convenable (REPONSE ACK)
+                pixel = (T_pixy2Pixel*) &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.
+            }
+            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_validateChecksum (Byte* tab){
     Word    i, sum = 0;