Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: pixy2.cpp
- Revision:
- 12:7493191dd1dc
- Parent:
- 11:68ef9f85e40e
- Child:
- 14:c0eda1e35a00
diff -r 68ef9f85e40e -r 7493191dd1dc pixy2.cpp --- a/pixy2.cpp Tue Mar 12 14:16:53 2019 +0000 +++ b/pixy2.cpp Tue Mar 12 16:51:31 2019 +0000 @@ -330,26 +330,25 @@ 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) - etat = idle; // Et on annoce que la pixy est libre } 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) + // 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 } } 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 checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente) - etat = idle; // Et on annoce que la pixy est libre + // Si le type est 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_NCSHEADERSIZE]; - // On mappe le résultat sur la donnée stockée dans la FIFO (ligne précédente) + // 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 break; default : // Dans tous les autres cas @@ -378,7 +377,57 @@ 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) - etat = idle; // Et on annoce que la pixy est libre + } 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 + } + } 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) + } 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 + }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 que la caméra est occupée. + break; + } + return cr; +} + + +T_pixy2ErrorCode PIXY2::pixy2_setCameraBrightness (Byte brightness){ + + 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 + PIXY2::pixy2_sndSetCameraBrightness (brightness); // On envoie la trame de règlage de la luminosité + 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]; @@ -387,17 +436,71 @@ } } 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 checksum et le type sont bon, on mappe le pointeur de résultat sur la FIFO (ligne précédente) - etat = idle; // Et on annoce que la pixy est libre + 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 + }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 + PIXY2::pixy2_sndSetServo (s0, s1); // On envoie la trame de règlage des servos moteurs + 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 @@ -407,21 +510,166 @@ return cr; } +T_pixy2ErrorCode PIXY2::pixy2_setLED (Byte red, Byte green, Byte blue){ -T_pixy2ErrorCode PIXY2::pixy2_setCameraBrightness (Byte brightness){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setServos (Word s0, Word s1){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setLED (Byte red, Byte green, Byte blue){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setLamp (Byte upper, Byte lower){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_getFPS (T_pixy2ReturnCode *framerate){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_getBlocks (Byte sigmap, Byte maxBloc){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_getMainFeature (Byte features){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_getAllFeature (Byte features){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setMode (Byte mode){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setNexTurn (Word angle){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setDefaultTurn (Word angle){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_setVector (Byte vectorIndex){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_ReverseVector (void){return 0;} -T_pixy2ErrorCode PIXY2::pixy2_getRGB (Word x, Word y, Byte saturate, T_pixy2Pixel *pixel){return 0;} + 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 + PIXY2::pixy2_sndSetLED (red, green, blue); // On envoie la trame de règlage des composantes de la LED RGB + 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_setLamp (Byte upper, Byte lower){ + + 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 + PIXY2::pixy2_sndSetLamp (upper, lower); // On envoie la trame de règlage d'allumage des lumières de contraste + 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_getFPS (T_pixy2ReturnCode *framerate){ + + T_pixy2RcvHeader *msg = (T_pixy2RcvHeader*) &Pixy2_buffer[rPointer]; + T_pixy2ErrorCode cr = PIXY2_OK; + + switch (etat) { + case idle : // Si la caméra est inactive + PIXY2::pixy2_sndGetFPS(); // On envoie la trame de règlage d'allumage des lumières de contraste + 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 + } + } 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) + } 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_getBlocks (Byte sigmap, Byte maxBloc){return PIXY2_OK;} +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;} +T_pixy2ErrorCode PIXY2::pixy2_setNexTurn (Word angle){return PIXY2_OK;} +T_pixy2ErrorCode PIXY2::pixy2_setDefaultTurn (Word angle){return PIXY2_OK;} +T_pixy2ErrorCode PIXY2::pixy2_setVector (Byte vectorIndex){return PIXY2_OK;} +T_pixy2ErrorCode PIXY2::pixy2_ReverseVector (void){return PIXY2_OK;} +T_pixy2ErrorCode PIXY2::pixy2_getRGB (Word x, Word y, Byte saturate, T_pixy2Pixel *pixel){return PIXY2_OK;} T_pixy2ErrorCode PIXY2::pixy2_validateChecksum (Byte* tab){ Word i, sum = 0; @@ -429,6 +677,6 @@ for (i=0; i<*(tab+3);i++) sum = sum + *(tab + PIXY2_CSHEADERSIZE + i); tmp = (T_Word*) (tab+4); - if (tmp->mot == sum) return 0; + if (tmp->mot == sum) return PIXY2_OK; else return PIXY2_BAD_CHECKSUM; }