FRC - Hackathon Pixy
Diff: Pixy.cpp
- Revision:
- 3:1e4c6d7a0053
- Parent:
- 2:90355c600404
- Child:
- 4:5982d904f7aa
- Child:
- 6:f16f250fe2cb
--- a/Pixy.cpp Tue May 22 17:15:30 2018 +0000 +++ b/Pixy.cpp Thu May 31 17:36:49 2018 +0000 @@ -8,65 +8,66 @@ FlagPixyOverflow = 0; Pixy_check = -1; - _cmucam = new Serial (tx, rx, debit); - _cmucam->attach (callback(this,&PIXY::getPixyByte)); + _Pixy = new Serial (tx, rx, debit); + _Pixy->attach (callback(this,&PIXY::getPixyByte)); } void PIXY::getPixyByte () { - static T_tmpBuffer tmpBuffer; - static T_structBuffer msgBuffer; + static T_msgBuffer msgBuffer; + static T_wordBuffer wordBuffer; static T_pixyState PIXY_state = none; static Byte byteCount = 0; - static int PIXY_synced = 0, dummy; - int i, somme; + static int PIXY_synced = 0; + Word i, somme; + Byte dummy; static Byte PIXY_nbCCObjet = 0, PIXY_wCCObjet = 0; static Byte PIXY_nbNMObjet = 0, PIXY_wNMObjet = 0; Pixy_check = 0; - if (!PIXY_synced) { // On n'a pas trouvé le START (0x55aa0000) - tmpBuffer.tab[byteCount] = _cmucam->getc(); // On stocke l'octet reçu dans la première case dispo du tableau temporaire + dummy = _Pixy->getc(); // On stocke l'octet reçu dans une variable temporaire + + if (!PIXY_synced) { // Si la camera et la carte ne sont pas synchronisées + msgBuffer.octet[byteCount] = dummy; // On stocke l'octet reçu dans la première case dispo du tableau temporaire - if (byteCount < 3) { // Si on n'a pas encore reçu les 4 premier octets - byteCount++; // On passe à la case suivante du tableau temporaire - } else { // Lorsqu'on a 4 octets - if (tmpBuffer.mot != 0xaa550000) { // Si le code n'est pas le code de START - for (i=1; i<4; i++) tmpBuffer.tab[i-1] = tmpBuffer.tab[i]; // On décalle les cases du tableau - byteCount = 3; // Et on attend le caractère suivant - } else { // Si on a trouvé le code de START - PIXY_synced = 1; // On passe en mode synchronisé - PIXY_state = begin; - byteCount = 0; + if (byteCount < 3) { // Tant qu'on n'a pas encore reçu les 4 premier octets + byteCount++; // On passe à la case suivante du tableau temporaire + } else { // Lorsqu'on a 4 octets + if ((msgBuffer.motlong == 0xaa550000)||(msgBuffer.motlong == 0xaa560000)) { // On teste pour voir si on a reçu un entête + PIXY_synced = 1; // Si oui : On passe en mode synchronisé + PIXY_state = begin; // Et on va à l'aiguillage + byteCount = 0; // Et on remet le comptage d'octet à 0 + } else { // Si on n'a pas trouvé d'entête + for (i=1; i<4; i++) msgBuffer.octet[i-1] = msgBuffer.octet[i]; // On décalle les cases du tableau + byteCount = 3; // Et on attend le caractère suivant } } - } - - if (PIXY_synced) { - + } else { switch (PIXY_state) { case begin : // l'aiguillage est là ! - - msgBuffer.tab[byteCount%2] = _cmucam->getc(); // on stocke les octets reçus + wordBuffer.octet[byteCount%2] = dummy; // on stocke les octets reçus byteCount++; if (byteCount == 2) { // Quand on a 2 octets + switch (wordBuffer.mot) { + case 0xaa55 : // Si c'est un bloc normal (code = 0xAA55) + PIXY_state = normal; // On part vers le traitement spécifique + break; - if (msgBuffer.mot == 0xaa55) { // Si c'est un bloc normal (code 0xAA55) - PIXY_state = normal; // On part vers le traitement spécifique - } + case 0xaa56 : // Si c'est un bloc color Code (code = 0xAA56) + PIXY_state = colorCode; // On part vers le traitement spécifique + break; - if (msgBuffer.mot == 0xaa56) { // Si c'est un bloc Color Code (code 0xAA56) - PIXY_state = colorCode; // On part vers le traitement spécifique - } + case 0 : // Si c'est un debut de trame (code = 0x0000) + PIXY_state = doubleZero; // On part vers le traitement spécifique + break; - if (msgBuffer.mot == 0) { // Si on a un debut de trame (code 0000) - PIXY_state = doubleZero; // On part vers le traitement spécifique - } - if ((PIXY_state == begin) || (PIXY_state == none)) { // Si c'est autre chose - PIXY_synced = 0; // C'est qu'on est perdu donc plus synchronisé. - PIXY_state = none; // Ceinture et bretelle + default : // Si c'est autre chose + PIXY_synced = 0; // C'est qu'on est perdu donc plus synchronisé. + PIXY_state = none; // Ceinture et bretelle + break; } byteCount = 0; } @@ -74,7 +75,7 @@ case normal : // Si on a un bloc normal - Pixy_NMFIFO[PIXY_wNMObjet].tab[byteCount] = _cmucam->getc(); // On stocke les octets un à un dans la structure Bloc + Pixy_NMFIFO[PIXY_wNMObjet].tab[byteCount] = dummy; // On stocke les octets un à un dans la structure Bloc if (byteCount < 11) { // Tant que la structure n'est pas pleine byteCount++; // On passe à l'octet suivant } else { // Quand elle est pleine @@ -113,27 +114,37 @@ } break; - case doubleZero : // Si on a reçu le code de début d'une nouvelle trame. + case doubleZero : // Si on a reçu le code de début d'une nouvelle trame (0000). + + Pixy_NMObjet = PIXY_nbNMObjet; // On met à jour les variables pour le traitement extérieur + Pixy_CCObjet = PIXY_nbCCObjet; + Pixy_CCFrameIsNew = 1; + Pixy_FirstCCObjet = PIXY_wCCObjet; + Pixy_NMFrameIsNew = 1; + Pixy_FirstNMObjet = PIXY_wNMObjet; + FlagPixy = 1; // On valide le traitement de la trame précédente. - msgBuffer.tab[byteCount%2] = _cmucam->getc(); // on stocke les octets reçus + PIXY_nbCCObjet = 0; // On remet à 0 les variables internes + PIXY_nbNMObjet = 0; + byteCount = 0; + + wordBuffer.octet[byteCount%2] = dummy; // on stocke les octets reçus + byteCount++; + PIXY_state = waitForStart; // On passe en attente de la deuxième partie du code + break; + + case waitForStart : // Si on a reçu le code de début d'une nouvelle trame. + + wordBuffer.octet[byteCount%2] = dummy; // on stocke les octets reçus byteCount++; if (byteCount == 2) { // Quand on a 2 octets - if (msgBuffer.mot == 0xaa55) { // On doit impérativement trouver le code 0xAA55 + byteCount = 0; + if (wordBuffer.mot == 0xaa55) { // On vérifie qu'on a bien reçu l'entête de depart PIXY_state = begin; // Si c'est le cas, alors tout va bien et on va à l'aiguillage - Pixy_NMObjet = PIXY_nbNMObjet; // On met à jour les variables pour le traitement - Pixy_CCObjet = PIXY_nbCCObjet; - PIXY_nbCCObjet = 0; - PIXY_nbNMObjet = 0; - Pixy_CCFrameIsNew = 1; - Pixy_FirstCCObjet = PIXY_wCCObjet; - Pixy_NMFrameIsNew = 1; - Pixy_FirstNMObjet = PIXY_wNMObjet; - FlagPixy = 1; // On valide le traitement de la trame précédente. - } else { // Si on trouve autre chose - PIXY_synced = 0; // C'est qu'on est perdu donc plus synchronisé. - PIXY_state = none; // Ceinture et bretelle + } else { // Si ce n'est pas le cas + PIXY_synced = 0; // On n'est plus synchronisés + PIXY_state = none; // Ceinture et Bretelles } - byteCount = 0; } break; } @@ -191,14 +202,24 @@ return dummy; } -int PIXY::setBrightness (Byte brightness) +void PIXY::setBrightness (Byte brightness) { - - Byte PixyMsgBuf[3]; + _Pixy->putc(0); //Start + _Pixy->putc(0xFE); //Brightness Level + _Pixy->putc(brightness); +} - PixyMsgBuf[0] = 0x00; //Start - PixyMsgBuf[1] = 0xFE; //Brightness Level - PixyMsgBuf[2] = brightness; +int PIXY::checkNewImage (void) +{ + if (FlagPixy) { + FlagPixy = 0; + return 1; + } else { + return 0; + } +} - return _cmucam->write(PixyMsgBuf,3,NULL,0); +int PIXY::checkPixy (void) +{ + return Pixy_check; } \ No newline at end of file