Waël Hazami / Mbed 2 deprecated Lib_PIXY2

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pixy2.cpp Source File

pixy2.cpp

00001 #include "pixy2.h"
00002 
00003 extern  int sommeDeControle,sommeRecue;
00004 extern Serial pc;
00005 
00006 PIXY2::PIXY2(PinName tx, PinName rx, int debit) : Pixy2_numBlocks(0), Pixy2_numVectors(0), Pixy2_numIntersections(0), Pixy2_numBarcodes(0)
00007 {   
00008     _Pixy2 = new Serial (tx, rx, debit);
00009     _Pixy2->attach (callback(this,&PIXY2::pixy2_getByte));
00010     etat = idle;
00011     Pixy2_buffer = (Byte*) malloc (0x100); 
00012 }
00013 
00014 PIXY2::~PIXY2()
00015 {
00016     free (Pixy2_buffer);
00017 }
00018 
00019 // POUR DEBUG //
00020 T_Pixy2State PIXY2::getEtat()
00021 {
00022     return this->etat;
00023 }
00024 
00025 void PIXY2::affDataSize()
00026 {
00027     pc.printf("dataSize : %d\n\r", this->dataSize);
00028 }
00029 // Pour détail d'une trame (a mettre dans la fct correspondante) :
00030 //pc.printf("pixSync : %d, pixType : %d, pixLength : %d, pixChecksum : %d\n\r", msg->pixSync, msg->pixType, msg->pixLength, msg->pixChecksum);
00031 
00032 /* Le programme utilise l'interruption de la liaison série pour recevoir le message et avancer la machine d'état pour permettre au programme de ne pas être bloquant en réception.
00033    Lorsqu'on appelle une fonction, elle retourne le code -2 pour signifier que le message de réponse de la caméra n'est pas completement reçu...
00034    Les étapes de fonctionnement sont les suivantes :
00035    
00036    * idle : La caméra n'a pas été solicité => on envoi le message de requête.
00037    * messageSent : La requête a été transmise, mais la réponse n'est pas encore arrivée.
00038    * receivingHeader : Le mot de synchro a été reçu, le reste de l'entête est en cours de réception.
00039    * receivingData : L'entête a été intégralement reçu (et traité) et on est en train de recevoir la payload.
00040    * dataReceived : La réponse a été intégralement reçue et est disponible pour le traitement (et la libération).
00041    
00042    On utilise plusieurs pointeurs : 
00043    * wPointer est le pointeur d'écriture des octets reçus dans le buffer de réception
00044    * hPointer est le pointeur de l'entête du message
00045    * dPointer est le pointeur de la zone de données
00046    
00047    On rajoute une variable : dataSize, qui définit la quantité de données à recevoir (issue de l'entête)
00048    
00049    **** COMMENT CA MARCHE ****
00050    
00051    Au début wPointer = 0. Quand wPointer est supérieur à 1 (donc qu'on a reçu au moins 2 octets), on regarde si on a reçu le code de début de trame 0xC1AF
00052    Si ce n'est pas le cas, on continue de recevoir les octets et on les stock jusqu'à trouver le code de début de trame.
00053    Quand on trouve le code, on enregistre le point de départ (c'est hPointer) comme étant la position actuelle du wPointer-1.
00054    A partir de ça, on attend de recevoir les 4 premiers octets de l'entête :
00055    * start of frame (hPointer et hPointer + 1)
00056    * identification du type (hPointer + 2)
00057    * taille des données (hPointer + 3)
00058    Et ensuite si on a une trame avec un checksum (normal) :
00059    * le checksum (hPointer + 4 et hPointer + 5)
00060    * les données (hPointer + 6 et +)
00061    Et si on a une trame sans checksum (pas normal) :
00062    * les données (hPointer + 4 et +)
00063    
00064    On continue alors de recevoir des octets jusqu'à ce que wPointer soit égal à dPointer + dataSize - 1
00065    par exemple si la data fait 4 octets et une trame avec checksum, on reçoit tant que wPointer est inférieur à 9 (6 + 4 - 1)
00066    ou pour la même quantité de données mais avec une trame sans checksum 7 (4 + 4 - 1)...
00067 */
00068 
00069 void PIXY2::pixy2_getByte ()    // Interruption de la pixy2
00070 {
00071     T_Word                  *buffer;
00072     
00073     Pixy2_buffer[wPointer] = _Pixy2->getc();                                        // On stocke l'octet reçu dans la première case dispo du buffer de réception
00074     
00075     
00076     switch (etat) {
00077         case messageSent :                                                          // Si on a envoyé une requete => on attend un entête
00078             if (wPointer > 0) {                                                     // On attend d'avoir reçu 2 octets
00079                 buffer = (T_Word*) &Pixy2_buffer[wPointer-1];                       // On pointe la structure sur les 2 derniers octets reçus
00080                 if ((buffer->mot == PIXY2_CSSYNC) || (buffer->mot == PIXY2_SYNC)) { // Si c'est un mot d'entête
00081                     etat = receivingHeader;                                         // On passe à l'état réception de l'entête
00082                     hPointer = wPointer - 1;                                       // On initialise le pointeur de l'entête
00083                     if (buffer->mot == PIXY2_SYNC) {
00084                         frameContainChecksum = 0;                                   // Si c'est un entête sans checksum, on mémorise qu'il n'y a pas de checksum à vérifier
00085                         dPointer = hPointer + PIXY2_NCSHEADERSIZE;
00086                     } else {
00087                         frameContainChecksum = 1;                                   // Sinon, on mémorise qu'il y a un checksum à vérifier
00088                         dPointer = hPointer + PIXY2_CSHEADERSIZE;
00089                     }
00090                 }                                                                   // Si on n'a pas de mot d'entête on attend d'en trouver un...
00091             }
00092             break;
00093 
00094         case receivingHeader :                                                      // Si on est en train de recevoir un entête (entre le SYNC et... La fin de l'entête)
00095             if ((frameContainChecksum && ((wPointer - hPointer) == (PIXY2_CSHEADERSIZE - 1))) || (!frameContainChecksum && ((wPointer - hPointer) == (PIXY2_NCSHEADERSIZE - 1)))) {
00096                                                                                     // 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
00097                 etat = receivingData;                                               // On dit que l'on va de recevoir des données
00098                 dataSize = Pixy2_buffer[hPointer + 3];                              // On enregistre la taille de la payload
00099                 if (dataSize == 0)                                                  // Si on reçoit rien, on reset le processus
00100                     etat = idle;
00101             }    
00102             break;
00103 
00104         case receivingData :                                                 // Si on est en train de recevoir des données.
00105             if (wPointer == ((dataSize - 1) + dPointer)) { 
00106                 etat = dataReceived;                                          // Quand on a reçu toutes les données promises on dit que c'est OK         
00107             }
00108             break;
00109 
00110         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.
00111             break;
00112     }
00113     wPointer++;                                                                     // on pointe la case suivante du buffer de réception
00114 
00115 }
00116 
00117 T_pixy2ErrorCode PIXY2::pixy2_sndGetVersion (void){
00118     T_pixy2SendBuffer   msg;
00119     int                 i = 0, dataSize = 0;
00120     msg.frame.header.pixSync = PIXY2_SYNC;
00121     msg.frame.header.pixType = PIXY2_ASK_VERS;
00122     msg.frame.header.pixLength = dataSize;
00123     do {
00124         while(!_Pixy2->writable());
00125         _Pixy2->putc(msg.data[i]);
00126         i++;
00127     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00128     return PIXY2_OK;
00129 }
00130 
00131 T_pixy2ErrorCode PIXY2::pixy2_sndGetResolution (void){
00132     T_pixy2SendBuffer   msg;
00133     int                 i = 0, dataSize = 1;
00134     msg.frame.header.pixSync = PIXY2_SYNC;
00135     msg.frame.header.pixType = PIXY2_ASK_RESOL;
00136     msg.frame.header.pixLength = dataSize;
00137     msg.frame.data[0] = 0;
00138     do {
00139         while(!_Pixy2->writable());
00140         _Pixy2->putc(msg.data[i]);
00141         i++;
00142     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00143     return PIXY2_OK;
00144 }
00145 
00146 T_pixy2ErrorCode PIXY2::pixy2_sndSetCameraBrightness (Byte brightness){
00147     T_pixy2SendBuffer   msg;
00148     int                 i = 0, dataSize = 1;
00149     msg.frame.header.pixSync = PIXY2_SYNC;
00150     msg.frame.header.pixType = PIXY2_SET_BRIGHT;
00151     msg.frame.header.pixLength = dataSize;
00152     msg.frame.data[0] = brightness;
00153     do {
00154         while(!_Pixy2->writable());
00155         _Pixy2->putc(msg.data[i]);
00156         i++;
00157     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00158     return PIXY2_OK;
00159 }
00160 
00161 T_pixy2ErrorCode PIXY2::pixy2_sndSetServo (Word s0, Word s1){
00162     T_pixy2SendBuffer   msg;
00163     int                 i = 0, dataSize = 4;
00164     T_Word              tmp;
00165     msg.frame.header.pixSync = PIXY2_SYNC;
00166     msg.frame.header.pixType = PIXY2_SET_SERVOS;
00167     msg.frame.header.pixLength = dataSize;
00168     tmp.mot = s0;
00169     msg.frame.data[0] = tmp.octet[0];
00170     msg.frame.data[1] = tmp.octet[1];
00171     tmp.mot = s1;
00172     msg.frame.data[2] = tmp.octet[0];
00173     msg.frame.data[3] = tmp.octet[1];
00174     do {
00175         while(!_Pixy2->writable());
00176         _Pixy2->putc(msg.data[i]);
00177         i++;
00178     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00179     return PIXY2_OK;
00180 }
00181 
00182 T_pixy2ErrorCode PIXY2::pixy2_sndSetLED (Byte red, Byte green, Byte blue){
00183     T_pixy2SendBuffer   msg;
00184     int                 i = 0, dataSize = 3;
00185     msg.frame.header.pixSync = PIXY2_SYNC;
00186     msg.frame.header.pixType = PIXY2_SET_LED;
00187     msg.frame.header.pixLength = dataSize;
00188     msg.frame.data[0] = red;
00189     msg.frame.data[1] = green;
00190     msg.frame.data[2] = blue;
00191     do {
00192         while(!_Pixy2->writable());
00193         _Pixy2->putc(msg.data[i]);
00194         i++;
00195     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00196     return PIXY2_OK;
00197 }
00198 
00199 T_pixy2ErrorCode PIXY2::pixy2_sndSetLamp (Byte upper, Byte lower){
00200     T_pixy2SendBuffer   msg;
00201     int                 i = 0, dataSize = 2;
00202     msg.frame.header.pixSync = PIXY2_SYNC;
00203     msg.frame.header.pixType = PIXY2_SET_LAMP;
00204     msg.frame.header.pixLength = dataSize;
00205     msg.frame.data[0] = upper;
00206     msg.frame.data[1] = lower;
00207     do {
00208         while(!_Pixy2->writable());
00209         _Pixy2->putc(msg.data[i]);
00210         i++;
00211     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00212     return PIXY2_OK;
00213 }
00214 
00215 T_pixy2ErrorCode PIXY2::pixy2_sndGetFPS (void){
00216     T_pixy2SendBuffer   msg;
00217     int                 i = 0, dataSize = 0;
00218     msg.frame.header.pixSync = PIXY2_SYNC;
00219     msg.frame.header.pixType = PIXY2_ASK_FPS;
00220     msg.frame.header.pixLength = dataSize;
00221     do {
00222         while(!_Pixy2->writable());
00223         _Pixy2->putc(msg.data[i]);
00224         i++;
00225     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00226     return PIXY2_OK;
00227 }
00228 
00229 T_pixy2ErrorCode PIXY2::pixy2_sndGetBlocks (Byte sigmap, Byte maxBloc){
00230     T_pixy2SendBuffer   msg;
00231     int                 i = 0, dataSize = 2;
00232     msg.frame.header.pixSync = PIXY2_SYNC;
00233     msg.frame.header.pixType = PIXY2_ASK_BLOC;
00234     msg.frame.header.pixLength = dataSize;
00235     msg.frame.data[0] = sigmap;
00236     msg.frame.data[1] = maxBloc;
00237     do {
00238         while(!_Pixy2->writable());
00239         _Pixy2->putc(msg.data[i]);
00240         i++;
00241     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00242     return PIXY2_OK;
00243 }
00244 
00245 T_pixy2ErrorCode PIXY2::pixy2_sndGetLineFeature (Byte type, Byte feature){
00246     T_pixy2SendBuffer   msg;
00247     int                 i = 0, dataSize = 2;
00248     msg.frame.header.pixSync = PIXY2_SYNC;
00249     msg.frame.header.pixType = PIXY2_ASK_LINE;
00250     msg.frame.header.pixLength = dataSize;
00251     msg.frame.data[0] = type;
00252     msg.frame.data[1] = feature;
00253     do {
00254         while(!_Pixy2->writable());
00255         _Pixy2->putc(msg.data[i]);
00256         i++;
00257     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00258     return PIXY2_OK;
00259 }
00260 
00261 T_pixy2ErrorCode PIXY2::pixy2_sndSetMode (Byte mode){
00262     T_pixy2SendBuffer   msg;
00263     int                 i = 0, dataSize = 1;
00264     msg.frame.header.pixSync = PIXY2_SYNC;
00265     msg.frame.header.pixType = PIXY2_SET_MODE;
00266     msg.frame.header.pixLength = dataSize;
00267     msg.frame.data[0] = mode;
00268     do {
00269         while(!_Pixy2->writable());
00270         _Pixy2->putc(msg.data[i]);
00271         i++;
00272     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00273     return PIXY2_OK;
00274 }
00275 
00276 T_pixy2ErrorCode PIXY2::pixy2_sndSetNextTurn (Word angle){
00277     T_pixy2SendBuffer   msg;
00278     int                 i = 0, dataSize = 2;
00279     T_Word              tmp;
00280     tmp.mot = angle;
00281     msg.frame.header.pixSync = PIXY2_SYNC;
00282     msg.frame.header.pixType = PIXY2_SET_TURN;
00283     msg.frame.header.pixLength = dataSize;
00284     tmp.mot = angle;
00285     msg.frame.data[0] = tmp.octet[0];
00286     msg.frame.data[1] = tmp.octet[1];
00287     do {
00288         while(!_Pixy2->writable());
00289         _Pixy2->putc(msg.data[i]);
00290         i++;
00291     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00292     return PIXY2_OK;
00293 }
00294 
00295 T_pixy2ErrorCode PIXY2::pixy2_sndSetDefaultTurn (Word angle){
00296     T_pixy2SendBuffer   msg;
00297     int                 i = 0, dataSize = 2;
00298     T_Word              tmp;
00299     tmp.mot = angle;
00300     msg.frame.header.pixSync = PIXY2_SYNC;
00301     msg.frame.header.pixType = PIXY2_SET_DEFTURN;
00302     msg.frame.header.pixLength = dataSize;
00303     tmp.mot = angle;
00304     msg.frame.data[0] = tmp.octet[0];
00305     msg.frame.data[1] = tmp.octet[1];
00306     do {
00307         while(!_Pixy2->writable());
00308         _Pixy2->putc(msg.data[i]);
00309         i++;
00310     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00311     return PIXY2_OK;
00312 }
00313 
00314 T_pixy2ErrorCode PIXY2::pixy2_sndSetVector (Byte vectorIndex){
00315     T_pixy2SendBuffer   msg;
00316     int                 i = 0, dataSize = 1;
00317     msg.frame.header.pixSync = PIXY2_SYNC;
00318     msg.frame.header.pixType = PIXY2_SET_VECTOR;
00319     msg.frame.header.pixLength = dataSize;
00320     msg.frame.data[0] = vectorIndex;
00321     do {
00322         while(!_Pixy2->writable());
00323         _Pixy2->putc(msg.data[i]);
00324         i++;
00325     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00326     return PIXY2_OK;
00327 }
00328 
00329 T_pixy2ErrorCode PIXY2::pixy2_sndReverseVector (void){
00330     T_pixy2SendBuffer   msg;
00331     int                 i = 0, dataSize = 0;
00332     msg.frame.header.pixSync = PIXY2_SYNC;
00333     msg.frame.header.pixType = PIXY2_SET_REVERSE;
00334     msg.frame.header.pixLength = dataSize;
00335     do {
00336         while(!_Pixy2->writable());
00337         _Pixy2->putc(msg.data[i]);
00338         i++;
00339     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00340     return PIXY2_OK;
00341 }
00342 
00343 T_pixy2ErrorCode PIXY2::pixy2_sndGetRGB (Word x, Word y, Byte saturate){
00344     T_pixy2SendBuffer   msg;
00345     int                 i = 0, dataSize = 5;
00346     msg.frame.header.pixSync = PIXY2_SYNC;
00347     msg.frame.header.pixType = PIXY2_ASK_VIDEO;
00348     msg.frame.header.pixLength = dataSize;
00349     msg.frame.data[0] = x;
00350     msg.frame.data[1] = y;
00351     msg.frame.data[2] = saturate;
00352     do {
00353         while(!_Pixy2->writable());
00354         _Pixy2->putc(msg.data[i]);
00355         i++;
00356     } while (i<(PIXY2_NCSHEADERSIZE+dataSize));
00357     return PIXY2_OK;
00358 }
00359 
00360 /*  La fonction est bloquante à l'envoi (pas vraiment le choix), mais elle est non bloquante en réception. On essayera de faire une fonction non bloquante en envoi avec write, mais c'est pas la priorité.
00361 Le principe c'est de stocker dans un buffer circulaire les données au fur et à mesure qu'elle sont reçues et de traiter uniquement en castant les infos. Pour cela, il faut recevoir et stocker. */
00362 
00363 T_pixy2ErrorCode PIXY2::pixy2_getVersion (T_pixy2Version **ptrVersion){
00364 
00365     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00366     T_pixy2ErrorCode    cr = PIXY2_OK;
00367     
00368     switch (etat) {
00369         case idle :                                                                 // Si la caméra est inactive
00370             wPointer = 0;                                                           // On remonte en haut du buffer
00371             cr = PIXY2::pixy2_sndGetVersion();                                      // On envoie la trame de demande de la version
00372             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00373             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00374             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00375             break;
00376             
00377         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00378             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00379                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00380                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00381                 }
00382             }
00383             if (msg->pixType == PIXY2_REP_VERS) {                                   // On vérifie que la trame est du type convenable (REPONSE VERSION)
00384                 *ptrVersion =   (T_pixy2Version*) &Pixy2_buffer[dPointer];          // On mappe le pointeur de structure sur le buffer de réception.         
00385             } else {                                                                // Si ce n'est pas le bon type
00386                 if (msg->pixType == PIXY2_REP_ERROR) {                              // Cela pourrait être une trame d'erreur
00387                     cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00388                 } else cr = PIXY2_TYPE_ERROR;                                       // Si le type ne correspond à rien de normal on signale une erreur de type.
00389             }
00390             etat = idle;                                                            // On annonce que la pixy est libre
00391             break;
00392 
00393         default :                                                                   // Dans tous les autres cas
00394             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00395             break;
00396     }
00397     return cr;
00398 }
00399 
00400 T_pixy2ErrorCode PIXY2::pixy2_getResolution (T_pixy2Resolution **ptrResolution){
00401 
00402     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00403     T_pixy2ErrorCode    cr = PIXY2_OK;
00404     
00405     switch (etat) {
00406         case idle :                                                                 // Si la caméra est inactive
00407             wPointer = 0;                                                           // On remonte en haut du buffer
00408             cr = PIXY2::pixy2_sndGetResolution();                                   // On envoie la trame de demande de la résolution
00409             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00410             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00411             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00412             break;
00413             
00414         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00415             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00416                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00417                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00418                 }
00419             }
00420             if (msg->pixType == PIXY2_REP_RESOL) {                                  // On vérifie que la trame est du type convenable (REPONSE RESOLUTION)
00421                 *ptrResolution = (T_pixy2Resolution*) &Pixy2_buffer[dPointer];      // On mappe le pointeur de structure sur le buffer de réception.
00422             } else {                                                                // Si ce n'est pas le bon type
00423                 if (msg->pixType == PIXY2_REP_ERROR) {                              // Cela pourrait être une trame d'erreur
00424                     cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00425                 } else cr = PIXY2_TYPE_ERROR;                                       // Si le type ne correspond à rien de normal on signale une erreur de type.
00426             }
00427             etat = idle;                                                            // On annoce que la pixy est libre
00428             break;
00429 
00430         default :                                                                   // Dans tous les autres cas
00431             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00432             break;
00433     }
00434     return cr;
00435 }
00436 
00437 T_pixy2ErrorCode PIXY2::pixy2_setCameraBrightness (Byte brightness){
00438 
00439     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00440     T_pixy2ErrorCode    cr = PIXY2_OK;
00441     
00442     switch (etat) {
00443         case idle :                                                                 // Si la caméra est inactive
00444             wPointer = 0;                                                           // On remonte en haut du buffer
00445             cr = PIXY2::pixy2_sndSetCameraBrightness (brightness);                  // On envoie la trame de règlage de la luminosité
00446             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00447             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00448             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00449             break;
00450             
00451         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00452             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00453                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00454                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00455                 }
00456             }
00457             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00458                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00459                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00460             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00461             etat = idle;                                                            // On annoce que la pixy est libre
00462             break;
00463 
00464         default :                                                                   // Dans tous les autres cas
00465             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00466             break;
00467     }
00468     return cr;
00469 }
00470 
00471 T_pixy2ErrorCode PIXY2::pixy2_setServos (Word s0, Word s1){
00472 
00473     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00474     T_pixy2ErrorCode    cr = PIXY2_OK;
00475     
00476     switch (etat) {
00477         case idle :                                                                 // Si la caméra est inactive
00478             wPointer = 0;                                                           // On remonte en haut du buffer
00479             cr = PIXY2::pixy2_sndSetServo (s0, s1);                                 // On envoie la trame de règlage des servos moteurs
00480             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00481             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00482             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00483             break;
00484             
00485         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00486             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00487                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00488                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00489                 }
00490             }
00491             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00492                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00493                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00494             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00495             etat = idle;                                                            // On annoce que la pixy est libre
00496             break;
00497 
00498         default :                                                                   // Dans tous les autres cas
00499             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00500             break;
00501     }
00502     return cr;
00503 }
00504 
00505 T_pixy2ErrorCode PIXY2::pixy2_setLED (Byte red, Byte green, Byte blue){
00506 
00507     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00508     T_pixy2ErrorCode    cr = PIXY2_OK;
00509     
00510     switch (etat) {
00511         case idle :                                                                 // Si la caméra est inactive
00512             wPointer = 0;                                                           // On remonte en haut du buffer
00513             cr = PIXY2::pixy2_sndSetLED (red, green, blue);                         // On envoie la trame de règlage des composantes de la LED RGB
00514             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00515             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00516             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00517             break;
00518             
00519         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00520             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00521                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00522                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00523                 }
00524             }
00525             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00526                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00527                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00528             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00529             etat = idle;                                                            // On annoce que la pixy est libre
00530             break;
00531 
00532         default :                                                                   // Dans tous les autres cas
00533             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00534             break;
00535     }
00536     return cr;
00537 }
00538 
00539 T_pixy2ErrorCode PIXY2::pixy2_setLamp (Byte upper, Byte lower){
00540 
00541     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00542     T_pixy2ErrorCode    cr = PIXY2_OK;
00543     
00544     switch (etat) {
00545         case idle :                                                                 // Si la caméra est inactive
00546             wPointer = 0;                                                           // On remonte en haut du buffer
00547             cr = PIXY2::pixy2_sndSetLamp (upper, lower);                            // On envoie la trame de règlage d'allumage des lumières de contraste
00548             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00549             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00550             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00551             break;
00552             
00553         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00554             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00555                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00556                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00557                 }
00558             }
00559             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00560                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00561                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00562             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00563             etat = idle;                                                            // On annoce que la pixy est libre
00564             break;
00565 
00566         default :                                                                   // Dans tous les autres cas
00567             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00568             break;
00569     }
00570     return cr;
00571 }
00572 
00573 T_pixy2ErrorCode PIXY2::pixy2_getFPS (T_pixy2ReturnCode **framerate){
00574 
00575     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00576     T_pixy2ErrorCode    cr = PIXY2_OK;
00577     
00578     switch (etat) {
00579         case idle :                                                                 // Si la caméra est inactive
00580             wPointer = 0;                                                           // On remonte en haut du buffer
00581             cr = PIXY2::pixy2_sndGetFPS();                                          // On envoie la trame de demande du Framerate
00582             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00583             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00584             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00585             break;
00586             
00587         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00588             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00589                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00590                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00591                 }
00592             }
00593             if (msg->pixType == PIXY2_REP_FPS) {                                    // On vérifie que la trame est du type convenable (REPONSE FPS)
00594                 *framerate = (T_pixy2ReturnCode*) &Pixy2_buffer[dPointer];           // On mappe le pointeur de structure sur le buffer de réception.
00595             } else {                                                                // Si ce n'est pas le bon type
00596                 if (msg->pixType == PIXY2_REP_ERROR) {                              // Cela pourrait être une trame d'erreur
00597                     cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00598                 } else cr = PIXY2_TYPE_ERROR;                                       // Si le type ne correspond à rien de normal on signale une erreur de type.
00599             }
00600             etat = idle;                                                            // On annoce que la pixy est libre
00601             break;
00602 
00603         default :                                                                   // Dans tous les autres cas
00604             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00605             break;
00606     }
00607     return cr;
00608 }
00609 
00610 T_pixy2ErrorCode PIXY2::pixy2_getBlocks (Byte sigmap, Byte maxBloc){
00611 
00612     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00613     T_pixy2ErrorCode    cr = PIXY2_OK;
00614     
00615     switch (etat) {
00616         case idle :                                                                 // Si la caméra est inactive
00617             wPointer = 0;                                                           // On remonte en haut du buffer
00618             cr = PIXY2::pixy2_sndGetBlocks(sigmap, maxBloc);                        // On envoie la trame de demande de blocs de couleur
00619             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00620             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00621             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00622             break;
00623             
00624         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00625             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00626                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00627                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00628                 }
00629             }
00630             if (msg->pixType == PIXY2_REP_BLOC) {                                   // On vérifie que la trame est du type convenable (REPONSE BLOCS)
00631                 Pixy2_blocks = (T_pixy2Bloc*) &Pixy2_buffer[dPointer];              // On mappe le pointeur de structure sur le buffer de réception.
00632                 Pixy2_numBlocks = dataSize / sizeof(T_pixy2Bloc);                   // On indique le nombre de blocs reçus
00633             } else {                                                                // Si ce n'est pas le bon type
00634                 if (msg->pixType == PIXY2_REP_ERROR) {                              // Cela pourrait être une trame d'erreur
00635                     cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00636                 } else cr = PIXY2_TYPE_ERROR;                                       // Si le type ne correspond à rien de normal on signale une erreur de type.
00637             }
00638             etat = idle;                                                            // On annoce que la pixy est libre
00639             break;
00640 
00641         default :                                                                   // Dans tous les autres cas
00642             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00643             break;
00644     }
00645     return cr;
00646 }
00647 
00648 T_pixy2ErrorCode PIXY2::pixy2_getFeatures (){
00649 
00650     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00651     T_pixy2ErrorCode    cr = PIXY2_OK;
00652     T_pixy2LineFeature* lineFeature;
00653     int                 fPointer;                                                   // Pointeur sur une feature entière
00654     int                 fdPointer;                                                  // Pointeur sur un élément à l'intérieur d'une feature
00655 
00656     if (frameContainChecksum) {                                                     // Si la trame contient un checksum
00657         if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {                // On lance la validation du checksum
00658             return PIXY2_BAD_CHECKSUM;                                              // Si le checksum est faux on retourne une erreur
00659         }
00660     }
00661     if (msg->pixType == PIXY2_REP_LINE) {                                       // On vérifie que la trame est du type convenable (REPONSE LIGNE)
00662         fPointer = dPointer;                                                        // On pointe sur la premiere feature
00663         do {
00664             lineFeature = (T_pixy2LineFeature*) &Pixy2_buffer[fPointer];            // On mappe le pointeur de structure sur le buffer de réception des features.
00665             if (lineFeature->fType == PIXY2_VECTOR) {                               // On regarde si le type est vecteur
00666                 Pixy2_numVectors = lineFeature->fLength / sizeof(T_pixy2Vector);    // Si oui, on compte combien il y a de vecteurs
00667                 fdPointer = fPointer + 2;                                           // On pointe sur le premier élément de la feature
00668                 Pixy2_vectors = (T_pixy2Vector*) &Pixy2_buffer[fdPointer];          // On mappe le résultat
00669                 fPointer += lineFeature->fLength + 2;                               // On déplace le pointeur de données et on recommence
00670                 cr |= PIXY2_VECTOR;
00671             }
00672             if (lineFeature->fType == PIXY2_INTERSECTION) {                         // On regarde si le type est intersection
00673                 Pixy2_numIntersections = lineFeature->fLength / sizeof(T_pixy2Intersection);
00674                                                                                     // Si oui, on compte combien il y a d'intersections
00675                 fdPointer = fPointer + 2;                                           // On pointe sur le premier élément de la feature                                                                    
00676                 Pixy2_intersections = (T_pixy2Intersection*) &Pixy2_buffer[fdPointer];
00677                                                                                     // On mappe le résultat sur l'entête de l'intersection
00678                 fPointer += lineFeature->fLength + 2;                               // On déplace le pointeur de données et on recommence
00679                 cr |= PIXY2_INTERSECTION;
00680             }
00681             if (lineFeature->fType == PIXY2_BARCODE) {                              // On regarde si le type est codebarre
00682                 Pixy2_numBarcodes = lineFeature->fLength / sizeof(T_pixy2BarCode);
00683                                                                                     // Si oui, on compte combien il y a de codebarre
00684                 fdPointer = fPointer + 2;                                           // On pointe sur le premier élément de la feature
00685                 Pixy2_barcodes = (T_pixy2BarCode*) &Pixy2_buffer[fdPointer];        // On mappe le résultat
00686                 fPointer += lineFeature->fLength + 2;                               // On déplace le pointeur de données et on recommence
00687                 cr |= PIXY2_BARCODE;
00688             }
00689         } while(fPointer < ((dataSize - 1) + dPointer));                            // Tant qu'il y a des données à traiter
00690     } else {                                                                        // Si ce n'est pas le bon type
00691         if (msg->pixType == PIXY2_REP_ERROR) {                                      // Cela pourrait être une trame d'erreur ou quand on ne reçoit rien
00692             cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                      // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00693         } else cr = PIXY2_TYPE_ERROR;                                               // Si le type ne correspond à rien de normal on signale une erreur de type.
00694     }
00695     etat = idle;                                                                    // On annoce que la pixy est libre
00696     return cr;
00697 }
00698 
00699 
00700 T_pixy2ErrorCode PIXY2::pixy2_getMainFeature (Byte features){
00701 
00702     T_pixy2ErrorCode    cr = PIXY2_OK;
00703     
00704     switch (etat) {
00705         case idle :                                                                 // Si la caméra est inactive
00706             wPointer = 0;                                                           // On remonte en haut du buffer
00707             cr = PIXY2::pixy2_sndGetLineFeature(0, features);                      // On envoie la trame de demande de suivi de ligne
00708             if (cr!= PIXY2_OK) return cr;                                          // S'il y a une erreur lors de l'envoi on ejecte !
00709             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00710             cr = PIXY2_BUSY;                                                    // On signale à l'utilisateur que la caméra est maintenant occupée
00711             break;
00712             
00713         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00714             cr = PIXY2::pixy2_getFeatures();                                        // On appelle la fonction de traitement.
00715             break;
00716 
00717         default :                                                                   // Dans tous les autres cas
00718             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00719             break;
00720     }
00721     return cr;
00722 }
00723 
00724 T_pixy2ErrorCode PIXY2::pixy2_getAllFeature (Byte features){
00725     T_pixy2ErrorCode    cr = PIXY2_OK;
00726 
00727     switch (etat) {
00728         case idle :                                                                 // Si la caméra est inactive
00729             wPointer = 0;                                                           // On remonte en haut du buffer
00730             cr = PIXY2::pixy2_sndGetLineFeature(1, features);                       // On envoie la trame de demande de suivi de ligne
00731             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00732             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00733             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00734             break;
00735 
00736         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00737             cr = PIXY2::pixy2_getFeatures();                                        // On appelle la fonction de traitement.
00738             break;
00739 
00740         default :                                                                   // Dans tous les autres cas
00741             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00742             break;
00743     }
00744     return cr;
00745 }
00746 
00747 T_pixy2ErrorCode PIXY2::pixy2_setMode (Byte mode)
00748 {
00749     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00750     T_pixy2ErrorCode    cr = PIXY2_OK;
00751 
00752     switch (etat) {
00753         case idle :                                                                 // Si la caméra est inactive
00754             wPointer = 0;                                                           // On remonte en haut du buffer
00755             cr = PIXY2::pixy2_sndSetMode (mode);                                    // On envoie la trame de règlage du mode de fonctionnement du suivi de ligne
00756             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00757             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00758             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00759             break;
00760 
00761         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00762             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00763                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00764                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00765                 }
00766             }
00767             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00768                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00769                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00770             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00771             etat = idle;                                                            // On annoce que la pixy est libre
00772             break;
00773 
00774         default :                                                                   // Dans tous les autres cas
00775             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00776             break;
00777     }
00778     return cr;
00779 }
00780 
00781 T_pixy2ErrorCode PIXY2::pixy2_setNextTurn (sWord angle)
00782 {
00783     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00784     T_pixy2ErrorCode    cr = PIXY2_OK;
00785 
00786     switch (etat) {
00787         case idle :                                                                 // Si la caméra est inactive
00788             wPointer = 0;                                                           // On remonte en haut du buffer
00789             cr = PIXY2::pixy2_sndSetNextTurn (angle);                               // On envoie la trame de choix de l'angle du prochain virage
00790             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00791             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00792             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00793             break;
00794 
00795         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00796             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00797                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00798                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00799                 }
00800             }
00801             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00802                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00803                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00804             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00805             etat = idle;                                                            // On annoce que la pixy est libre
00806             break;
00807 
00808         default :                                                                   // Dans tous les autres cas
00809             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00810             break;
00811     }
00812     return cr;
00813 }
00814 
00815 T_pixy2ErrorCode PIXY2::pixy2_setDefaultTurn (sWord angle)
00816 {
00817     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00818     T_pixy2ErrorCode    cr = PIXY2_OK;
00819 
00820     switch (etat) {
00821         case idle :                                                                 // Si la caméra est inactive
00822             wPointer = 0;                                                           // On remonte en haut du buffer
00823             cr = PIXY2::pixy2_sndSetDefaultTurn (angle);                            // On envoie la trame de choix de l'angle par défaut des virages
00824             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00825             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00826             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00827             break;
00828 
00829         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00830             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00831                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00832                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00833                 }
00834             }
00835             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00836                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00837                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00838             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00839             etat = idle;                                                            // On annoce que la pixy est libre
00840             break;
00841 
00842         default :                                                                   // Dans tous les autres cas
00843             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00844             break;
00845     }
00846     return cr;
00847 }
00848 
00849 T_pixy2ErrorCode PIXY2::pixy2_setVector (Byte vectorIndex)
00850 {
00851     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00852     T_pixy2ErrorCode    cr = PIXY2_OK;
00853 
00854     switch (etat) {
00855         case idle :                                                                 // Si la caméra est inactive
00856             wPointer = 0;                                                           // On remonte en haut du buffer
00857             cr = PIXY2::pixy2_sndSetVector (vectorIndex);                           // On envoie la trame de choix du vecteur à suivre
00858             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00859             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00860             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00861             break;
00862 
00863         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00864             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00865                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00866                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00867                 }
00868             }
00869             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00870                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00871                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00872             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00873             etat = idle;                                                            // On annoce que la pixy est libre
00874             break;
00875 
00876         default :                                                                   // Dans tous les autres cas
00877             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00878             break;
00879     }
00880     return cr;
00881 }
00882 
00883 
00884 T_pixy2ErrorCode PIXY2::pixy2_ReverseVector (void)
00885 {
00886     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00887     T_pixy2ErrorCode    cr = PIXY2_OK;
00888 
00889     switch (etat) {
00890         case idle :                                                                 // Si la caméra est inactive
00891             wPointer = 0;                                                           // On remonte en haut du buffer
00892             cr = PIXY2::pixy2_sndReverseVector ();                                  // On envoie la trame d'inversion de l'image (haut en bas et bas en haut)
00893             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00894             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00895             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00896             break;
00897 
00898         case dataReceived :                                                         // Quand on a reçu l'intégralité du message
00899             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00900                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00901                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00902                 }
00903             }
00904             if ((msg->pixType == PIXY2_REP_ACK) || (msg->pixType == PIXY2_REP_ERROR)) {
00905                                                                                     // On vérifie que la trame est du type convenable (ACK ou ERREUR)
00906                 cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];                  // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00907             } else cr = PIXY2_TYPE_ERROR;                                           // Si le type ne correspond à rien de normal on signale une erreur de type.
00908             etat = idle;                                                            // On annoce que la pixy est libre
00909             break;
00910 
00911         default :                                                                   // Dans tous les autres cas
00912             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00913             break;
00914     }
00915     return cr;
00916 }
00917 
00918 T_pixy2ErrorCode PIXY2::pixy2_getRGB (Word x, Word y, Byte saturate, T_pixy2Pixel **pixel){
00919 
00920     T_pixy2RcvHeader    *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[hPointer];
00921     T_pixy2ErrorCode    cr = PIXY2_OK;
00922     
00923     switch (etat) {
00924         case idle :                                                                 // Si la caméra est inactive
00925             wPointer = 0;                                                           // On remonte en haut du buffer
00926             cr = PIXY2::pixy2_sndGetRGB(x, y, saturate);                            // On envoie la trame de demande de la couleur (RGB) d'un carée de pixel
00927             if (cr!= PIXY2_OK) return cr;                                           // S'il y a une erreur lors de l'envoi on ejecte !
00928             etat = messageSent;                                                     // On passe à l'attente du message de réponse
00929             cr = PIXY2_BUSY;                                                        // On signale à l'utilisateur que la caméra est maintenant occupée
00930             break;
00931             
00932         case dataReceived :                                                      // Quand on a reçu l'intégralité du message
00933             if (frameContainChecksum) {                                             // Si la trame contient un checksum
00934                 if (pixy2_validateChecksum (&Pixy2_buffer[hPointer]) != 0) {        // On lance la validation du checksum
00935                     return PIXY2_BAD_CHECKSUM;                                      // Si le checksum est faux on retourne une erreur
00936                 }
00937             }
00938             if (msg->pixType == PIXY2_REP_ACK) {                                    // On vérifie que la trame est du type convenable (REPONSE ACK)
00939                 *pixel = (T_pixy2Pixel*) &Pixy2_buffer[dPointer];                    // On mappe le pointeur de structure sur le buffer de réception.
00940             } else {                                                                // Si ce n'est pas le bon type
00941                 if (msg->pixType == PIXY2_REP_ERROR) {                              // Cela pourrait être une trame d'erreur
00942                     cr = *(T_pixy2ErrorCode*) &Pixy2_buffer[dPointer];              // Si c'est le cas, on copie le code d'erreur reçu dans la variable de retour
00943                 } else cr = PIXY2_TYPE_ERROR;                                       // Si le type ne correspond à rien de normal on signale une erreur de type.
00944             }
00945             etat = idle;                                                            // On annoce que la pixy est libre
00946             break;
00947 
00948         default :                                                                   // Dans tous les autres cas
00949             cr = PIXY2_BUSY;                                                        // On signale que la caméra est occupée.
00950             break;
00951     }
00952     return cr;
00953 }
00954 
00955 
00956 
00957 T_pixy2ErrorCode PIXY2::pixy2_validateChecksum (Byte* tab){
00958     Word    i, sum = 0;
00959     T_Word  *tmp;
00960     
00961     for (i=0; i<*(tab+3);i++)   sum = sum + *(tab + PIXY2_CSHEADERSIZE + i);
00962     tmp = (T_Word*) (tab+4);
00963     
00964     if (tmp->mot == sum) return PIXY2_OK;
00965     else {
00966         if (_DEBUG_) {
00967             sommeDeControle = sum;
00968             sommeRecue = tmp->mot;
00969         }
00970         return PIXY2_BAD_CHECKSUM;
00971     }
00972 }