carte_strategie_2019
Dependencies: mbed SerialHalfDuplex SDFileSystem DISCO-F469NI_portrait liaison_Bluetooth ident_crac
Diff: Strategie/Strategie.cpp
- Revision:
- 44:badcbe8766e9
- Parent:
- 42:657b6a573e11
- Child:
- 45:4f93e99bac6e
--- a/Strategie/Strategie.cpp Thu May 17 13:08:31 2018 +0000 +++ b/Strategie/Strategie.cpp Tue May 07 17:37:46 2019 +0000 @@ -1,6 +1,6 @@ - #include "global.h" +#include "global.h" #include <string.h> -#include <sstream> +#include <sstream> //#include "StrategieManager.h" @@ -13,11 +13,10 @@ #define BLANC 0xFF000000 #define ORANGE 0xFFFFA500 #define NOIR 0xFF000000 -#define DIY_GREY 0xFFDFDFDF +#define DIY_GREY 0xFFDFDFDF char tableau_aff[10][50]; -char tableau_etat[22][50]= -{ +char tableau_etat[22][50]= { "Check_carte_screen", "Check_carte_screen_wait_ack", "Check_cartes", @@ -59,7 +58,7 @@ Timer debugetatTimer; Timer timeoutWarning; Timer timeoutWarningWaitEnd; -Timeout chronoEnd;//permet d'envoyer la trame CAN pour la fin +Timeout chronoEnd;//permet d'envoyer la trame CAN pour la fin unsigned char screenChecktry = 0; unsigned char test[32] = {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32}; @@ -85,9 +84,15 @@ unsigned char Cote = 0; //0 -> VERT | 1 -> jaune unsigned short angleRecalage = 0; unsigned char checkCurrent = 0; -unsigned char countAliveCard = 0; +unsigned char countAliveCard = 0; unsigned char ligne=0; + +int Fevitement=0; +int EvitEtat= 0; +int stop_evitement=0; + + float angle_moyen_balise_IR = 0.0; @@ -97,15 +102,17 @@ unsigned char countRobotNear = 0;//Le nombre de robot à proximité -unsigned char ingnorBaliseOnce = 0; +unsigned char ingnorBaliseOnce = 0;//une fois détecté réinitialise +unsigned char ingnorBalise = 0;//0:balise ignore 1:on ecoute la balise +unsigned char robot_arrete = 0; unsigned char ingnorInversionOnce = 0;//Pour ignorer l'inversion des instruction une fois struct S_Instruction instruction; char couleur1, couleur2, couleur3; -float cptf; -int cpt,cpt1; +float cptf; +int cpt,cpt1; typedef enum {INIT, ATT, CHOIX, DEMO, TEST_TELEMETRE, TEST_CAPTEURS, TEST_SERVO, TEST_TIR, DEMO_IMMEUBLE,DEMO_TRIEUR, SELECT_SIDE, TACTIQUE, DETAILS,LECTURE, LAUNCH, AFF_WAIT_JACK, WAIT_JACK, COMPTEUR, FIN} T_etat; T_etat etat = INIT; @@ -114,41 +121,41 @@ E_Stratposdebut etat_pos=RECALAGE_1; /////////////////DEFINITION DES BOUTONS//////////////////// - Button COTE_VERT(0, 25, 400, 300, "VERT"); - Button COTE_ORANGE(0, 350, 400, 300, "ORANGE"); - Button RETOUR (0, 680, 400, 110, "--Precedent--"); - Button LANCER (0, 200, 400, 200, "--LANCER--"); - Button CHECK (0, 420, 400, 200, "Valider"); - Button MATCH (0, 50, 400, 320, "Match"); - Button DEMONSTRATION (0, 400, 400, 320, "Demo"); - Button TEST_HERKULEX(0, 25, 400, 100, "Test servos"); - Button TEST_LASER(0, 135, 400, 100, "Test telemetre"); - Button TEST_COULEURS(0,245,400,100,"Test capteurs"); - Button TEST_TIR_BALLE(0,355,400,100,"Test Lanceur"); - Button TEST_IMMEUBLE(0,465,400,100,"Test immeuble"); - Button TEST_TRIEUR(0,575,400,100,"Test aiguilleur"); - Button TIR_CHATEAU(0, 25, 400, 100, "Tir chateau"); - Button EPURATION(0, 150, 400, 100, "epuration"); - Button LANCEUR_ON(0,275,400,100,"allumer le lanceur"); - Button LANCEUR_OFF(0,400,400,100,"eteindre le lanceur"); - Button ABAISSE_BLOC(0, 25, 400, 100, "Ramasser blocs"); - Button RELEVE_BLOC(0, 135, 400, 100, "lacher blocs"); - Button BRAS_ABEILLE_ON(0,245,400,100,"bras abeille"); - Button BRAS_ABEILLE_OFF(0,355,400,100,"baisser bras abeille"); - Button INTERRUPTEUR_ON(0,465,400,100,"baisser bras interrupt"); - Button INTERRUPTEUR_OFF(0,575,400,100,"baisser bras interrupt"); - Button FORCE_LAUNCH(0, 50, 400, 320, "Force Launch"); - Button TRI(0, 25, 400, 100, "Test tri"); - Button AIGUILLEUR_D(0, 150, 400, 100, "aiguilleur droite"); - Button AIGUILLEUR_G(0,275,400,100,"aiguilleur gauche"); - Button AIGUILLEUR_CTRE(0,400,400,100,"aiguilleur centre"); - Button SUIVANT(0,380,200,100,"Suivant"); - Button COLOR_ORANGE (0, 230, 190, 110,""); - Button COLOR_JAUNE (210, 230, 190, 110,""); - Button COLOR_VERT (0, 350, 190, 110,""); - Button COLOR_BLEU (210, 350, 190, 110,""); - Button COLOR_NOIR (105, 470, 190, 110,""); - //////////////////////////////////////////////////////////// +Button COTE_VERT(0, 25, 400, 300, "VERT"); +Button COTE_ORANGE(0, 350, 400, 300, "ORANGE"); +Button RETOUR (0, 680, 400, 110, "--Precedent--"); +Button LANCER (0, 200, 400, 200, "--LANCER--"); +Button CHECK (0, 420, 400, 200, "Valider"); +Button MATCH (0, 50, 400, 320, "Match"); +Button DEMONSTRATION (0, 400, 400, 320, "Demo"); +Button TEST_HERKULEX(0, 25, 400, 100, "Test servos"); +Button TEST_LASER(0, 135, 400, 100, "Test telemetre"); +Button TEST_COULEURS(0,245,400,100,"Test capteurs"); +Button TEST_TIR_BALLE(0,355,400,100,"Test Lanceur"); +Button TEST_IMMEUBLE(0,465,400,100,"Test immeuble"); +Button TEST_TRIEUR(0,575,400,100,"Test aiguilleur"); +Button TIR_CHATEAU(0, 25, 400, 100, "Tir chateau"); +Button EPURATION(0, 150, 400, 100, "epuration"); +Button LANCEUR_ON(0,275,400,100,"allumer le lanceur"); +Button LANCEUR_OFF(0,400,400,100,"eteindre le lanceur"); +Button ABAISSE_BLOC(0, 25, 400, 100, "Ramasser blocs"); +Button RELEVE_BLOC(0, 135, 400, 100, "lacher blocs"); +Button BRAS_ABEILLE_ON(0,245,400,100,"bras abeille"); +Button BRAS_ABEILLE_OFF(0,355,400,100,"baisser bras abeille"); +Button INTERRUPTEUR_ON(0,465,400,100,"baisser bras interrupt"); +Button INTERRUPTEUR_OFF(0,575,400,100,"baisser bras interrupt"); +Button FORCE_LAUNCH(0, 50, 400, 320, "Force Launch"); +Button TRI(0, 25, 400, 100, "Test tri"); +Button AIGUILLEUR_D(0, 150, 400, 100, "aiguilleur droite"); +Button AIGUILLEUR_G(0,275,400,100,"aiguilleur gauche"); +Button AIGUILLEUR_CTRE(0,400,400,100,"aiguilleur centre"); +Button SUIVANT(0,380,200,100,"Suivant"); +Button COLOR_ORANGE (0, 230, 190, 110,""); +Button COLOR_JAUNE (210, 230, 190, 110,""); +Button COLOR_VERT (0, 350, 190, 110,""); +Button COLOR_BLEU (210, 350, 190, 110,""); +Button COLOR_NOIR (105, 470, 190, 110,""); +//////////////////////////////////////////////////////////// void SendRawId (unsigned short id); void SelectionStrat (unsigned char numeroStrat); @@ -184,8 +191,8 @@ #endif - - + + /****************************************************************************************/ @@ -198,7 +205,7 @@ SendRawId(GLOBAL_GAME_END);//Indication fin de match etat=FIN; gameTimer.stop();//Arret du timer - + while(1);//On bloque la programme dans l'interruption } @@ -227,59 +234,58 @@ { lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); - - switch (Strategie+1) - { + + switch (Strategie+1) { case 0x1 : //description de Strategie n°1 lcd.DisplayStringAt(150, 0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x2 : //description de Strategie n°2 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x3 : //description de Strategie n°3 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x4 : //description de Strategie n°4 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x5 : //description de Strategie n°5 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x6 : //description de Strategie n°5 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x7 : //description de Strategie n°5 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x8 : //description de Strategie n°5 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0x9 : //description de Strategie n°5 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - + case 0xA : //description de Strategie n°5 lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE); break; - } + } } void Setflag(void) @@ -288,64 +294,65 @@ } -//Affiche une variable sur l'écran tactile// -void affichage_var(double Var){ +//Affiche une variable sur l'écran tactile// +void affichage_var(double Var) +{ if(ligne==7) ligne=0; char aff[10]="toto"; sprintf(aff,"%lf ",Var); lcd.DisplayStringAt(120, LINE(20+(ligne)), (uint8_t *)aff, LEFT_MODE); //ligne++; - + } /****************************************************************************************/ /* FUNCTION NAME: affichage_debug */ /* DESCRIPTION : Affiche l'état de gameEtat sur l'écran lcd */ -/****************************************************************************************/ -void affichage_debug(int Var){ +/****************************************************************************************/ +void affichage_debug(int Var) +{ int i; int conv=(int)Var; SUIVANT.Draw(ROUGE, 0); - for(i=0;i<9;i++){ + for(i=0; i<9; i++) { strcpy(tableau_aff[i],""); strcpy(tableau_aff[i],tableau_aff[i+1]); } strcpy(tableau_aff[9],tableau_etat[conv]); - for(i=0;i<10;i++){ + for(i=0; i<10; i++) { lcd.SetBackColor(VERT); lcd.DisplayStringAt(0, LINE(20+i), (uint8_t *)tableau_aff[i], LEFT_MODE); - } + } /*while(!ack_bluetooth){ // mode pas à pas en bluetooth ou via écran //liaison_bluetooth(); } ack_bluetooth=0;*/ /*while(SUIVANT.Touched()==0); while(SUIVANT.Touched());*/ -} +} /****************************************************************************************/ /* FUNCTION NAME: automate_etat_ihm */ /* DESCRIPTION : Automate de gestion de l'affichage */ -/****************************************************************************************/ +/****************************************************************************************/ void automate_etat_ihm(void) { int j; - if (j==0){ + if (j==0) { ts.Init(lcd.GetXSize(), lcd.GetYSize()); j++; } - ts.GetState(&TS_State); - switch (etat) - { + ts.GetState(&TS_State); + switch (etat) { case INIT : //intialise l'écran et passe à l'attente d'initialisation des cartes - ts.GetState(&TS_State); + ts.GetState(&TS_State); canProcessRx(); - - - - + + + + lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.Clear (LCD_COLOR_WHITE); @@ -355,32 +362,31 @@ lcd.SetTextColor(DIY_GREY); lcd.FillRect(0,400,400,150); //carte moteur lcd.FillRect(0,600,400,150); //Balise - + lcd.SetTextColor(LCD_COLOR_BLACK); lcd.SetBackColor(DIY_GREY); lcd.DisplayStringAt(80, 450, (uint8_t *)"Carte Moteur", LEFT_MODE); - lcd.DisplayStringAt(110,650 , (uint8_t *)"Balise", LEFT_MODE); + lcd.DisplayStringAt(110,650, (uint8_t *)"Balise", LEFT_MODE); //////////////////////////////////////// - - FORCE_LAUNCH.Draw(0xFFFF0000, 0); - + + FORCE_LAUNCH.Draw(0xFFFF0000, 0); + etat=ATT; break; - + case ATT : //Si les cartes sont présentes passe directement à choix sinon attente de force Launch (cette partie est encore buggée mais les cartes affichent bien leur présence donc faut juste force launch tout le temps...) - if (flag==1){ + if (flag==1) { etat = CHOIX; gameEtat = ETAT_CONFIG; - } - else if (FORCE_LAUNCH.Touched()){ + } else if (FORCE_LAUNCH.Touched()) { etat = CHOIX; gameEtat = ETAT_CONFIG; while(FORCE_LAUNCH.Touched()); } - + break; - - + + case CHOIX : //Match ou DEMO lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); @@ -388,25 +394,22 @@ lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", LEFT_MODE); DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0); MATCH.Draw(0xFFF01010, 0); - while(etat == CHOIX) - { + while(etat == CHOIX) { canProcessRx(); - if(DEMONSTRATION.Touched()) - { + if(DEMONSTRATION.Touched()) { etat = DEMO; while(DEMONSTRATION.Touched()); } - - if(MATCH.Touched()) - { + + if(MATCH.Touched()) { etat = SELECT_SIDE; while(MATCH.Touched()); } } break; - - case DEMO : + + case DEMO : lcd.Clear(LCD_COLOR_WHITE); RETOUR.Draw(0xFFFF0000, 0); TEST_HERKULEX.Draw(VERT, 0); @@ -416,13 +419,11 @@ TEST_IMMEUBLE.Draw(VERT,0); TEST_TRIEUR.Draw(VERT,0); if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config// - InversStrat = 0;//Pas d'inversion de la couleur + InversStrat = 0;//Pas d'inversion de la couleur } - while (etat == DEMO) ////////////////////////////LISTE DES DIFFERENTES DEMOS POSSIBLES/////////////////////////////////////////// - { + while (etat == DEMO) { ////////////////////////////LISTE DES DIFFERENTES DEMOS POSSIBLES/////////////////////////////////////////// canProcessRx(); - if(TEST_HERKULEX.Touched()) - { + if(TEST_HERKULEX.Touched()) { //Strat = 0x10; while(TEST_HERKULEX.Touched()); CANMessage trame_Tx = CANMessage(); @@ -434,27 +435,24 @@ can2.write(trame_Tx); TEST_HERKULEX.Draw(0xFFF0F0F0, 0); etat = TEST_SERVO; - lcd.Clear(LCD_COLOR_WHITE); + lcd.Clear(LCD_COLOR_WHITE); ModeDemo=1; - } - else if(TEST_LASER.Touched()) - { - //Strat = 0x11; - while(TEST_LASER.Touched()); + } else if(TEST_LASER.Touched()) { + //Strat = 0x11; + while(TEST_LASER.Touched()); TEST_LASER.Draw(0xFFF0F0F0, 0); etat = TEST_TELEMETRE; - } - else if (TEST_COULEURS.Touched()){ + } else if (TEST_COULEURS.Touched()) { while(TEST_COULEURS.Touched()); - TEST_LASER.Draw(0xFFF0F0F0, 0); - etat =TEST_CAPTEURS ; + TEST_LASER.Draw(0xFFF0F0F0, 0); + etat =TEST_CAPTEURS ; } - - else if (TEST_TIR_BALLE.Touched()){ + + else if (TEST_TIR_BALLE.Touched()) { while(TEST_TIR_BALLE.Touched()); - TEST_TIR_BALLE.Draw(0xFFF0F0F0, 0); - etat =TEST_TIR ; - lcd.Clear(LCD_COLOR_WHITE); + TEST_TIR_BALLE.Draw(0xFFF0F0F0, 0); + etat =TEST_TIR ; + lcd.Clear(LCD_COLOR_WHITE); CANMessage trame_Tx = CANMessage(); trame_Tx.len = 1; trame_Tx.format = CANStandard; @@ -462,24 +460,21 @@ trame_Tx.id=CHOICE_COLOR; trame_Tx.data[0]=0x2; can2.write(trame_Tx); - ModeDemo=1; - } - else if(TEST_IMMEUBLE.Touched()){ - while(TEST_IMMEUBLE.Touched()); - TEST_IMMEUBLE.Draw(0xFFF0F0F0, 0); - etat =DEMO_IMMEUBLE; - lcd.Clear(LCD_COLOR_WHITE); - } - else if(TEST_TRIEUR.Touched()){ + ModeDemo=1; + } else if(TEST_IMMEUBLE.Touched()) { + while(TEST_IMMEUBLE.Touched()); + TEST_IMMEUBLE.Draw(0xFFF0F0F0, 0); + etat =DEMO_IMMEUBLE; + lcd.Clear(LCD_COLOR_WHITE); + } else if(TEST_TRIEUR.Touched()) { while(TEST_TRIEUR.Touched()); etat=DEMO_TRIEUR; lcd.Clear(LCD_COLOR_WHITE); - } - if(RETOUR.Touched()) - { + } + if(RETOUR.Touched()) { etat = CHOIX; while(RETOUR.Touched()); - + } if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config Ack_strat = 1; @@ -487,21 +482,20 @@ } } break; - ///////////////////////////////TESTE LES SERVOS LIES AU TRI DES BALLES/////////////////////////////// - case DEMO_TRIEUR: + ///////////////////////////////TESTE LES SERVOS LIES AU TRI DES BALLES/////////////////////////////// + case DEMO_TRIEUR: lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE); TRI.Draw(VERT, 0); AIGUILLEUR_D.Draw(VERT, 0); AIGUILLEUR_G.Draw(VERT, 0); AIGUILLEUR_CTRE.Draw(VERT, 0); - while(etat==DEMO_TRIEUR){ - if(RETOUR.Touched()){ + while(etat==DEMO_TRIEUR) { + if(RETOUR.Touched()) { while (RETOUR.Touched()); etat=DEMO; - } - else if(TRI.Touched()){ - while (TRI.Touched()); + } else if(TRI.Touched()) { + while (TRI.Touched()); SendRawId(AIGUILLEUR_CENTRE); wait(0.5); SendRawId(AIGUILLEUR_DROITE); @@ -509,86 +503,78 @@ SendRawId(AIGUILLEUR_GAUCHE); wait(0.5); SendRawId(AIGUILLEUR_CENTRE); - + break; - } - else if(AIGUILLEUR_D.Touched()){ - while (AIGUILLEUR_D.Touched()); + } else if(AIGUILLEUR_D.Touched()) { + while (AIGUILLEUR_D.Touched()); SendRawId(AIGUILLEUR_DROITE); break; - } - else if(AIGUILLEUR_G.Touched()){ + } else if(AIGUILLEUR_G.Touched()) { while (AIGUILLEUR_G.Touched()); - SendRawId(AIGUILLEUR_GAUCHE); + SendRawId(AIGUILLEUR_GAUCHE); break; - - } - else if(BRAS_ABEILLE_OFF.Touched()){ - while (BRAS_ABEILLE_OFF.Touched()); + + } else if(BRAS_ABEILLE_OFF.Touched()) { + while (BRAS_ABEILLE_OFF.Touched()); SendRawId(BRAS_ABEILLE_DOWN); - break; - } - else if(AIGUILLEUR_CTRE.Touched()){ - while (AIGUILLEUR_CTRE.Touched()); - SendRawId(AIGUILLEUR_CENTRE); - break; - } - + break; + } else if(AIGUILLEUR_CTRE.Touched()) { + while (AIGUILLEUR_CTRE.Touched()); + SendRawId(AIGUILLEUR_CENTRE); + break; + } + } break; case DEMO_IMMEUBLE: //TESTE LE MONTE IMMEUBLE SUIVANT UN CODE COULEUR CHOISI int color=0; lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"Choix du code couleur", LEFT_MODE); - + CANMessage msgTx=CANMessage(); msgTx.id=MONTER_IMMEUBLE; // Monter immeuble msgTx.len=3; msgTx.format=CANStandard; msgTx.type=CANData; - - - while(etat==DEMO_IMMEUBLE){ - switch(color){ + + + while(etat==DEMO_IMMEUBLE) { + switch(color) { case 0: - + RETOUR.Draw(ROUGE,0); COLOR_NOIR.Draw(NOIR,1); COLOR_ORANGE.Draw(ORANGE,0); COLOR_JAUNE.Draw(JAUNE,0); COLOR_VERT.Draw(VERT,0); COLOR_BLEU.Draw(BLEU,0); - + lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(NOIR); lcd.DisplayStringAt(100, LINE(4), (uint8_t *)"COULEUR 1", LEFT_MODE); - while(color==0){ - if(COLOR_ORANGE.Touched()){ + while(color==0) { + if(COLOR_ORANGE.Touched()) { while(COLOR_ORANGE.Touched()); COLOR_ORANGE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=1; + msgTx.data[color]=1; color++; - } - else if (COLOR_NOIR.Touched()){ + } else if (COLOR_NOIR.Touched()) { while(COLOR_NOIR.Touched()); COLOR_NOIR.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=2; + msgTx.data[color]=2; color++; - } - else if (COLOR_VERT.Touched()){ + } else if (COLOR_VERT.Touched()) { while(COLOR_VERT.Touched()); COLOR_VERT.Draw(LCD_COLOR_WHITE); - + msgTx.data[color]=3; color++; - } - else if (COLOR_JAUNE.Touched()){ + } else if (COLOR_JAUNE.Touched()) { while(COLOR_JAUNE.Touched()); COLOR_JAUNE.Draw(LCD_COLOR_WHITE); msgTx.data[color]=4; color++; - } - else if (COLOR_BLEU.Touched()){ + } else if (COLOR_BLEU.Touched()) { while(COLOR_BLEU.Touched()); COLOR_ORANGE.Draw(LCD_COLOR_WHITE); msgTx.data[color]=5; @@ -596,109 +582,101 @@ } } break; - + case 1: lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(NOIR); lcd.DisplayStringAt(100, LINE(4), (uint8_t *)"COULEUR 2", LEFT_MODE); - if(COLOR_ORANGE.Touched()){ - while(COLOR_ORANGE.Touched()); - COLOR_ORANGE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=1; - color++; - } - else if (COLOR_NOIR.Touched()){ - while(COLOR_NOIR.Touched()); - COLOR_NOIR.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=2; - color++; - } - else if (COLOR_VERT.Touched()){ - while(COLOR_VERT.Touched()); - COLOR_VERT.Draw(LCD_COLOR_WHITE); - - msgTx.data[color]=3; - color++; - } - else if (COLOR_JAUNE.Touched()){ - while(COLOR_JAUNE.Touched()); - COLOR_JAUNE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=4; - color++; - } - else if (COLOR_BLEU.Touched()){ - while(COLOR_BLEU.Touched()); - COLOR_ORANGE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=5; - color++; - } + if(COLOR_ORANGE.Touched()) { + while(COLOR_ORANGE.Touched()); + COLOR_ORANGE.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=1; + color++; + } else if (COLOR_NOIR.Touched()) { + while(COLOR_NOIR.Touched()); + COLOR_NOIR.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=2; + color++; + } else if (COLOR_VERT.Touched()) { + while(COLOR_VERT.Touched()); + COLOR_VERT.Draw(LCD_COLOR_WHITE); + + msgTx.data[color]=3; + color++; + } else if (COLOR_JAUNE.Touched()) { + while(COLOR_JAUNE.Touched()); + COLOR_JAUNE.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=4; + color++; + } else if (COLOR_BLEU.Touched()) { + while(COLOR_BLEU.Touched()); + COLOR_ORANGE.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=5; + color++; + } break; - + case 2: lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(NOIR); lcd.DisplayStringAt(100, LINE(4), (uint8_t *)"COULEUR 3", LEFT_MODE); - if(COLOR_ORANGE.Touched()){ - while(COLOR_ORANGE.Touched()); - COLOR_ORANGE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=1; - color++; - } - else if (COLOR_NOIR.Touched()){ - while(COLOR_NOIR.Touched()); - COLOR_NOIR.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=2; - color++; - } - else if (COLOR_VERT.Touched()){ - while(COLOR_VERT.Touched()); - COLOR_VERT.Draw(LCD_COLOR_WHITE); - - msgTx.data[color]=3; - color++; - } - else if (COLOR_JAUNE.Touched()){ - while(COLOR_JAUNE.Touched()); - COLOR_JAUNE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=4; - color++; - } - else if (COLOR_BLEU.Touched()){ - while(COLOR_BLEU.Touched()); - COLOR_ORANGE.Draw(LCD_COLOR_WHITE); - msgTx.data[color]=5; - color++; - } + if(COLOR_ORANGE.Touched()) { + while(COLOR_ORANGE.Touched()); + COLOR_ORANGE.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=1; + color++; + } else if (COLOR_NOIR.Touched()) { + while(COLOR_NOIR.Touched()); + COLOR_NOIR.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=2; + color++; + } else if (COLOR_VERT.Touched()) { + while(COLOR_VERT.Touched()); + COLOR_VERT.Draw(LCD_COLOR_WHITE); + + msgTx.data[color]=3; + color++; + } else if (COLOR_JAUNE.Touched()) { + while(COLOR_JAUNE.Touched()); + COLOR_JAUNE.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=4; + color++; + } else if (COLOR_BLEU.Touched()) { + while(COLOR_BLEU.Touched()); + COLOR_ORANGE.Draw(LCD_COLOR_WHITE); + msgTx.data[color]=5; + color++; + } break; case 3: lcd.Clear(LCD_COLOR_WHITE); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(NOIR); - + lcd.DisplayStringAt(0, LINE(4), (uint8_t *)"Immeuble en construction", LEFT_MODE); RETOUR.Draw(ROUGE,0); can2.write(msgTx); color++; break; - + case 4: - if(RETOUR.Touched()){ + if(RETOUR.Touched()) { while(RETOUR.Touched()); - etat=DEMO; + etat=DEMO; } break; } - if(RETOUR.Touched()){ + if(RETOUR.Touched()) { while(RETOUR.Touched()); etat=DEMO; } } break; - - - - - + + + + + case TEST_SERVO: //TEST DU RESTE DES SERVOS DISPO HORS TIR lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE); @@ -709,45 +687,39 @@ INTERRUPTEUR_ON.Draw(VERT, 0); INTERRUPTEUR_OFF.Draw(VERT, 0); RETOUR.Draw(0xFFFF0000,0); - while(etat==TEST_SERVO){ - if(RETOUR.Touched()){ + while(etat==TEST_SERVO) { + if(RETOUR.Touched()) { while (RETOUR.Touched()); etat=DEMO; - } - else if(ABAISSE_BLOC.Touched()){ - while (ABAISSE_BLOC.Touched()); + } else if(ABAISSE_BLOC.Touched()) { + while (ABAISSE_BLOC.Touched()); SendRawId(BAISSER_ATTRAPE_BLOC); break; - } - else if(RELEVE_BLOC.Touched()){ - while (RELEVE_BLOC.Touched()); + } else if(RELEVE_BLOC.Touched()) { + while (RELEVE_BLOC.Touched()); SendRawId(RELEVER_ATTRAPE_BLOC); break; - } - else if(BRAS_ABEILLE_ON.Touched()){ + } else if(BRAS_ABEILLE_ON.Touched()) { while (BRAS_ABEILLE_ON.Touched()); - SendRawId(BRAS_ABEILLE_UP); + SendRawId(BRAS_ABEILLE_UP); break; - - } - else if(BRAS_ABEILLE_OFF.Touched()){ - while (BRAS_ABEILLE_OFF.Touched()); + + } else if(BRAS_ABEILLE_OFF.Touched()) { + while (BRAS_ABEILLE_OFF.Touched()); SendRawId(BRAS_ABEILLE_DOWN); - break; - } - else if(INTERRUPTEUR_ON.Touched()){ - while (INTERRUPTEUR_ON.Touched()); - SendRawId(ALLUMER_PANNEAU_UP); - break; - } - else if(INTERRUPTEUR_OFF.Touched()){ - while (INTERRUPTEUR_OFF.Touched()); - SendRawId(ALLUMER_PANNEAU_DOWN); + break; + } else if(INTERRUPTEUR_ON.Touched()) { + while (INTERRUPTEUR_ON.Touched()); + SendRawId(ALLUMER_PANNEAU_UP); + break; + } else if(INTERRUPTEUR_OFF.Touched()) { + while (INTERRUPTEUR_OFF.Touched()); + SendRawId(ALLUMER_PANNEAU_DOWN); break; } - } + } break; - + case TEST_TIR: // TEST DES FONCTIONS LIEES AUX TIRS lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE); @@ -756,79 +728,73 @@ LANCEUR_ON.Draw(VERT, 0); LANCEUR_OFF.Draw(VERT, 0); RETOUR.Draw(ROUGE, 0); - while(etat==TEST_TIR){ - if(TIR_CHATEAU.Touched()){ + while(etat==TEST_TIR) { + if(TIR_CHATEAU.Touched()) { while (TIR_CHATEAU.Touched()); SendRawId(INCLINAISON_CHATEAU); break; - } - else if (EPURATION.Touched()){ + } else if (EPURATION.Touched()) { while (EPURATION.Touched()); SendRawId(INCLINAISON_EPURATION); break; - } - else if(LANCEUR_ON.Touched()){ + } else if(LANCEUR_ON.Touched()) { while (LANCEUR_ON.Touched()); CANMessage msgTx=CANMessage(); msgTx.format=CANStandard; msgTx.type=CANData; msgTx.id=LANCEMENT_MOTEUR_TIR_ON; - + msgTx.len=1; msgTx.data[0]=0; can2.write(msgTx); break; - } - else if(LANCEUR_OFF.Touched()){ + } else if(LANCEUR_OFF.Touched()) { while (LANCEUR_OFF.Touched()); SendRawId(LANCEMENT_MOTEUR_TIR_OFF); break; - } - else if (RETOUR.Touched()){ + } else if (RETOUR.Touched()) { while (RETOUR.Touched()); etat=DEMO; - + } } - break; - - - + break; + + + case TEST_TELEMETRE: //AFFICHAGE DE LA VALEUR LUE PAR LES 4 TELEMETRES ModeDemo=1; lcd.Clear(LCD_COLOR_WHITE); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE); RETOUR.Draw(0xFFFF0000, 0); - while(etat==TEST_TELEMETRE){ + while(etat==TEST_TELEMETRE) { SendRawId(DATA_RECALAGE); wait(0.1); canProcessRx(); - if(RETOUR.Touched()){ - while( RETOUR.Touched()); - etat=DEMO; - lcd.Clear(LCD_COLOR_WHITE); + if(RETOUR.Touched()) { + while( RETOUR.Touched()); + etat=DEMO; + lcd.Clear(LCD_COLOR_WHITE); } } break; ///////////////////////////////////////////FIN DES DEMOS///////////////////////////////////////////////// - - + + case SELECT_SIDE : // CHOIX DU COTE DU TERRAIN + INVERSION DE LA STRAT SI COTE ORANGE+ ENVOI DU COTE A LA CARTE CAPTEUR/ACTIONNEURS lcd.Clear(LCD_COLOR_WHITE); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); - + lcd.DisplayStringAt(70, LINE(0), (uint8_t *)"Choisir le cote", LEFT_MODE); COTE_VERT.Draw(VERT, 0); COTE_ORANGE.Draw(ORANGE, 0); RETOUR.Draw(LCD_COLOR_RED, 0); - - - while (etat == SELECT_SIDE) - { + + + while (etat == SELECT_SIDE) { canProcessRx(); - if(COTE_VERT.Touched()) - { + if(COTE_VERT.Touched()) { Cote = 0x0; InversStrat = Cote; etat = TACTIQUE; @@ -840,11 +806,10 @@ trame_Tx.data[0]=Cote; can2.write(trame_Tx); while(COTE_VERT.Touched()); - + } - - if(COTE_ORANGE.Touched()) - { + + if(COTE_ORANGE.Touched()) { Cote = 0x1; InversStrat= Cote; etat = TACTIQUE; @@ -857,120 +822,109 @@ can2.write(trame_Tx); while(COTE_ORANGE.Touched()); } - - if(RETOUR.Touched()) - { + + if(RETOUR.Touched()) { etat = CHOIX; while(RETOUR.Touched()); } } - + break; - + case TACTIQUE : //AFFICHE LA LISTE DES STRATS AFIN DE SELECTIONNER CELLE VOULUE - if (Cote == 0){ + if (Cote == 0) { lcd.Clear(VERT); lcd.SetBackColor(VERT); - } - else if (Cote == 1){ + } else if (Cote == 1) { lcd.Clear(ORANGE); lcd.SetBackColor(ORANGE); - } - else { + } else { lcd.Clear(BLEU); lcd.SetBackColor(BLEU); - } - - lcd.SetTextColor(LCD_COLOR_BLACK); - + } + + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.DisplayStringAt(20, LINE(0), (uint8_t *)"Choisir une strategie", LEFT_MODE); - + Strategie = Bouton_Strat(); // retourne valeur de Strategie si bouton strat renvoi -1 on reviens en arriere - if (Strategie == -1) - { + if (Strategie == -1) { etat = SELECT_SIDE; + } else { + etat = DETAILS; } - else - { - etat = DETAILS; - } wait(0.1); break; - + case DETAILS : //SECONDE VALIDATION DE LA STRAT lcd.Clear(LCD_COLOR_WHITE); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); CHECK.Draw(VERT); RETOUR.Draw(LCD_COLOR_RED); - + SelectionStrat(Strategie); //affiche la stratégie selectionnée - - while (etat == DETAILS) - { + + while (etat == DETAILS) { canProcessRx(); - if (CHECK.Touched()) - { - if(gameEtat == ETAT_CONFIG) { - gameEtat = ETAT_GAME_INIT; - etat=LECTURE; - - } - while(CHECK.Touched()); + if (CHECK.Touched()) { + if(gameEtat == ETAT_CONFIG) { + gameEtat = ETAT_GAME_INIT; + etat=LECTURE; + } - - if(RETOUR.Touched()) - { - etat = TACTIQUE; - while(RETOUR.Touched()); - } - } + while(CHECK.Touched()); + } + + if(RETOUR.Touched()) { + etat = TACTIQUE; + while(RETOUR.Touched()); + } + } break; - - + + case LECTURE : - break; + break; case AFF_WAIT_JACK : //FONCTIONS D'AFFICHAGE DE L'ATTENTE DU JACK lcd.Clear(BLANC); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); - - if (Cote == 0){ + + if (Cote == 0) { lcd.Clear(VERT); lcd.SetBackColor(VERT); - } - else if (Cote == 1){ + } else if (Cote == 1) { lcd.Clear(ORANGE); lcd.SetBackColor(ORANGE); - } - else { + } else { lcd.Clear(VERT); lcd.SetBackColor(VERT); } canProcessRx(); - lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE); + lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE); etat=WAIT_JACK; break; - + case WAIT_JACK: //VERITABLE ATTENTE DU JACK - break; - + break; + case COMPTEUR: //PEUT AFFICHER UN COMPTEUR DU TEMPS RESTANT AVANT LA FIN DE LA PARTIE OU BIEN TRES UTILE POUR PRINT DES VARIABLES CHAQUE SEC EX: gameEtat cptf=gameTimer.read(); lcd.SetTextColor(LCD_COLOR_BLACK); cpt=(int)cptf; - if(cpt != cpt1){ + if(cpt != cpt1) { lcd.Clear(VERT); - // affichage_compteur(100-cpt); + // affichage_compteur(100-cpt); //affichage_compteur(SCORE_PR); - #ifdef ROBOT_BIG - affichage_var(SCORE_GR); - #else - affichage_var(SCORE_PR); - #endif - if(liaison_pr.paquet_en_attente()){ +#ifdef ROBOT_BIG + affichage_var(SCORE_GR); +#else + affichage_var(SCORE_PR); +#endif + if(liaison_pr.paquet_en_attente()) { PaquetDomotique *paquet=liaison_pr.lire(); - if(paquet->identifiant==PAQUET_IDENTIFIANT_AJOUTERSCORE){ + if(paquet->identifiant==PAQUET_IDENTIFIANT_AJOUTERSCORE) { SCORE_PR+=convertir_score(paquet); } delete paquet; @@ -981,24 +935,24 @@ //affichage_debug(gameEtat); lcd.SetBackColor(LCD_COLOR_WHITE); - + break; - + case FIN : //AFFICHAGE DE FIN AVEC LE SCORE FINAL lcd.Clear (LCD_COLOR_WHITE); lcd.SetBackColor(LCD_COLOR_WHITE); - #ifdef ROBOT_BIG - // affichage_compteur(SCORE_GR); - affichage_var(SCORE_GR); - //liaison_Tx.envoyer_short(PAQUET_IDENTIFIANT_FINMATCH,SCORE_GLOBAL); - #else - //affichage_compteur(SCORE_PR); - affichage_var(SCORE_PR); - #endif - while(1); // force le redemarage du robot +#ifdef ROBOT_BIG + // affichage_compteur(SCORE_GR); + affichage_var(SCORE_GR); + //liaison_Tx.envoyer_short(PAQUET_IDENTIFIANT_FINMATCH,SCORE_GLOBAL); +#else + //affichage_compteur(SCORE_PR); + affichage_var(SCORE_PR); +#endif + while(1); // force le redemarage du robot //break; - - } + + } } @@ -1007,7 +961,8 @@ /* FUNCTION NAME: automate_process */ /* DESCRIPTION : Automate de gestion de la stratégie du robot */ /****************************************************************************************/ -void automate_process(void){ +void automate_process(void) +{ static unsigned char AX12_enchainement = 0; static unsigned char MV_enchainement = 0; signed char localData1 = 0; @@ -1015,36 +970,36 @@ unsigned short localData3 = 0; //signed short localData4 = 0; unsigned char localData5 = 0; - + + if(gameTimer.read_ms() >= 99000) {//Fin du match (On autorise 2s pour déposer des éléments gameTimer.stop(); gameTimer.reset(); gameEtat = ETAT_END;//Fin du temps etat=FIN; } - + if(lastEtat != gameEtat || debugetatTimer.read_ms() >= 1000) { lastEtat = gameEtat; debugetatTimer.reset(); sendStratEtat((unsigned char)gameEtat, (unsigned char)actual_instruction); } - - switch(gameEtat) - { - - case ETAT_CHECK_CARTES: + + switch(gameEtat) { + + case ETAT_CHECK_CARTES: /* Il faut faire une boucle pour verifier toutes les cartes les une apres les autres */ waitingAckFrom = id_alive[checkCurrent];//On indique que l'on attend un ack de la carte IHM SendRawId(id_check[checkCurrent]);//On demande à la carte d'indiquer ça présence - + screenChecktry++;//On incrèment le conteur de tentative de 1 cartesCheker.reset();//On reset le timeOut cartesCheker.start();//On lance le timer pour le timeout gameEtat = ETAT_CHECK_CARTES_WAIT_ACK; break; - + case ETAT_CHECK_CARTES_WAIT_ACK: /* On attend l'ack de la carte en cours de vérification @@ -1061,41 +1016,35 @@ gameEtat = ETAT_CONFIG; SendRawId(ECRAN_ALL_CHECK); flag=1; - + //tactile_printf("Selection couleur et strategie"); - } - else { + } else { gameEtat = ETAT_WAIT_FORCE;//Passage en attente de forçage du lancement waitingAckFrom = ECRAN_ALL_CHECK; } - } - else + } else gameEtat = ETAT_CHECK_CARTES; - } - else if(cartesCheker.read_ms () > 100) { + } else if(cartesCheker.read_ms () > 100) { cartesCheker.stop(); if(screenChecktry >=3) { //printf("missing card %d\n",id_check[checkCurrent]); screenChecktry = 0; checkCurrent++; - - if(checkCurrent >= NOMBRE_CARTES){ - if(countAliveCard == NOMBRE_CARTES){ + + if(checkCurrent >= NOMBRE_CARTES) { + if(countAliveCard == NOMBRE_CARTES) { gameEtat = ETAT_CONFIG; - flag=1; - } - else{ + flag=1; + } else { gameEtat = ETAT_WAIT_FORCE; waitingAckFrom = ECRAN_ALL_CHECK; } - } - else + } else gameEtat = ETAT_CHECK_CARTES; - - } - else + + } else gameEtat = ETAT_CHECK_CARTES; - + } break; case ETAT_WAIT_FORCE: @@ -1116,26 +1065,23 @@ break; case ETAT_GAME_INIT: //On charge la liste des instructions - + loadAllInstruction(Strategie);//Mise en cache de toute les instructions led3=1; - + SendRawId(GLOBAL_START); - + gameEtat = ETAT_GAME_WAIT_FOR_JACK; - if (etat == TEST_TELEMETRE|| etat ==TEST_CAPTEURS || etat == TEST_SERVO || etat ==TEST_TIR || etat == DEMO_IMMEUBLE) - { + if (etat == TEST_TELEMETRE|| etat ==TEST_CAPTEURS || etat == TEST_SERVO || etat ==TEST_TIR || etat == DEMO_IMMEUBLE) { SendRawId(DEBUG_FAKE_JAKE); + } else { + etat = AFF_WAIT_JACK; } - else - { - etat = AFF_WAIT_JACK; - } //tactile_printf("Attente du JACK."); setAsservissementEtat(1);//On réactive l'asservissement jack.mode(PullDown); // désactivation de la résistance interne du jack jack.fall(&jack_ISR); // création de l'interrupt attachée au changement d'état (front descendant) sur le jack - + localData2 = POSITION_DEBUT_T; localData3 = POSITION_DEBUT_Y; if(InversStrat == 1) { @@ -1143,108 +1089,107 @@ localData3 = 3000 - POSITION_DEBUT_Y;//Inversion du Y } SetOdometrie(ODOMETRIE_SMALL_POSITION, POSITION_DEBUT_X,1800,localData2); - + instruction = strat_instructions[actual_instruction]; - //On effectue le traitement de l'instruction - - break; + //On effectue le traitement de l'instruction + + break; case ETAT_GAME_WAIT_FOR_JACK: - if(instruction.order==POSITION_DEBUT){ - switch(etat_pos){ // AUTOMATE PERMETTANT AU ROBOT DE SE POSITIONNER TOUT SEUL AU DEBUT DE LA PARTIE (Ne PAS RETIRER LE JACK PENDANT CE TEMPS !!!) + if(instruction.order==POSITION_DEBUT) { + switch(etat_pos) { // AUTOMATE PERMETTANT AU ROBOT DE SE POSITIONNER TOUT SEUL AU DEBUT DE LA PARTIE (Ne PAS RETIRER LE JACK PENDANT CE TEMPS !!!) case RECALAGE_1: waitingAckID = ASSERVISSEMENT_RECALAGE; - waitingAckFrom = ACKNOWLEDGE_MOTEUR; - #ifdef ROBOT_SMALL + waitingAckFrom = ACKNOWLEDGE_MOTEUR; +#ifdef ROBOT_SMALL GoStraight(3000, 1,MOITIEE_ROBOT-5, 0); //on se recale contre le mur donc il faut donner la valeur du centre du robot (les -5 qui trainent sont dus au tables pourraves sur place) - #else +#else GoStraight(-3000, 1,MOITIEE_ROBOT-5, 0); - #endif +#endif while(waitingAckID !=0 && waitingAckFrom !=0) canProcessRx(); waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; - waitingAckFrom_FIN= INSTRUCTION_END_MOTEUR; + waitingAckFrom_FIN= INSTRUCTION_END_MOTEUR; while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) canProcessRx(); etat_pos=RECULER_1; break; - + case RECULER_1: waitingAckID = ASSERVISSEMENT_RECALAGE; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - #ifdef ROBOT_SMALL - GoStraight(-450, 0, 0, 0); - #else +#ifdef ROBOT_SMALL + GoStraight(-40, 0, 0, 0);//-450 +#else GoStraight(150, 0, 0, 0); - #endif +#endif while(waitingAckID !=0 && waitingAckFrom !=0) canProcessRx(); waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; - waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) canProcessRx(); etat_pos=TOURNER; - break; - + break; + case TOURNER: waitingAckID = ASSERVISSEMENT_ROTATION; - waitingAckFrom = ACKNOWLEDGE_MOTEUR; - if(Cote==0){ + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + if(Cote==0) { localData2 = 900; - } - else{ + } else { localData2=-900; } Rotate(localData2); while(waitingAckID !=0 && waitingAckFrom !=0) canProcessRx(); waitingAckID_FIN=ASSERVISSEMENT_ROTATION; - waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) canProcessRx(); etat_pos=RECALAGE_2; - break; - + break; + case RECALAGE_2: waitingAckID = ASSERVISSEMENT_RECALAGE; - waitingAckFrom = ACKNOWLEDGE_MOTEUR; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; if(Cote==1) - localData3=3000-(MOITIEE_ROBOT-5); + localData3=3000-(MOITIEE_ROBOT-5); else localData3=MOITIEE_ROBOT; - #ifdef ROBOT_SMALL +#ifdef ROBOT_SMALL GoStraight(3000, 2,localData3, 0); //on se recale contre le mur donc il faut donner la valeur du centre du robot - #else +#else GoStraight(-3000, 2,localData3, 0); - #endif +#endif while(waitingAckID !=0 && waitingAckFrom !=0) canProcessRx(); waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; - waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) canProcessRx(); etat_pos=RECULER_2; - break; - - case RECULER_2: + break; + + case RECULER_2: waitingAckID = ASSERVISSEMENT_RECALAGE; - waitingAckFrom = ACKNOWLEDGE_MOTEUR; - #ifdef ROBOT_SMALL - GoStraight(-200, 0, 0, 0); - #else + waitingAckFrom = ACKNOWLEDGE_MOTEUR; +#ifdef ROBOT_SMALL + GoStraight(-40, 0, 0, 0); +#else GoStraight(200, 0, 0, 0); - #endif +#endif while(waitingAckID !=0 && waitingAckFrom !=0) canProcessRx(); waitingAckID_FIN=ASSERVISSEMENT_RECALAGE; - waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) canProcessRx(); etat_pos=GOTOPOS; break; - + case GOTOPOS: localData1 = -1; - + if(InversStrat == 1 && ingnorInversionOnce == 0) { localData2 = -instruction.arg3; localData3 = 3000 - instruction.arg2;//Inversion du Y @@ -1252,58 +1197,58 @@ localData3 = instruction.arg2; localData2 = instruction.arg3; } - + GoToPosition(instruction.arg1,localData3,localData2,localData1); waitingAckID = ASSERVISSEMENT_XYT; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - + while(waitingAckID !=0 && waitingAckFrom !=0) canProcessRx(); waitingAckID_FIN=ASSERVISSEMENT_XYT; - waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) canProcessRx(); etat_pos=FIN_POS; - break; + break; case FIN_POS: actual_instruction = instruction.nextLineOK; - break; + break; } } - - - break; + + + break; case ETAT_GAME_START: - + gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - - if (ModeDemo == 0){ + + if (ModeDemo == 0) { chronoEnd.attach(&chronometre_ISR,100);//On lance le chrono de 90s gameTimer.start(); - } + } gameTimer.reset(); jack.fall(NULL);//On désactive l'interruption du jack - //SendRawId(GLOBAL_START); + //SendRawId(GLOBAL_START); Jack=0; //à envoyer sur le CAN et en direct pour l'automate de l'ihm ou sur CANV //tactile_printf("Start");//Pas vraiment utile mais bon - break; + break; case ETAT_GAME_LOAD_NEXT_INSTRUCTION: /* Chargement de l'instruction suivante ou arret du robot si il n'y a plus d'instruction */ //printf("load next instruction\n"); - + if(actual_instruction >= nb_instructions || actual_instruction == 255) { gameEtat = ETAT_END; //Il n'y a plus d'instruction, fin du jeu } else { instruction = strat_instructions[actual_instruction]; - //On effectue le traitement de l'instruction + //On effectue le traitement de l'instruction gameEtat = ETAT_GAME_PROCESS_INSTRUCTION; } screenChecktry = 0; ingnorInversionOnce = 0; - break; + break; case ETAT_GAME_PROCESS_INSTRUCTION: /* Traitement de l'instruction, envoie de la trame CAN @@ -1311,13 +1256,12 @@ //debug_Instruction(instruction); //affichage_debug(gameEtat); actionPrecedente = instruction.order; - switch(instruction.order) - { + switch(instruction.order) { case MV_COURBURE://C'est un rayon de courbure actionPrecedente = MV_COURBURE; waitingAckID = ASSERVISSEMENT_COURBURE; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - if(instruction.nextActionType == ENCHAINEMENT){ + if(instruction.nextActionType == ENCHAINEMENT) { MV_enchainement++; localData5 = 1; } else { @@ -1330,22 +1274,21 @@ } localData1 = ((instruction.direction == LEFT)?1:-1); localData2 = instruction.arg3; - if(InversStrat == 1 && ingnorInversionOnce == 0) - { + if(InversStrat == 1 && ingnorInversionOnce == 0) { localData1 = -localData1;//Inversion de la direction } BendRadius(instruction.arg1, localData2, localData1, localData5); - - + + target_theta_robot = localData2 - theta_robot; /* if(instruction.direction == LEFT){ - + }else{ target_theta_robot = theta_robot + localData2; }*/ - - break; + + break; case MV_LINE://Ligne droite waitingAckID = ASSERVISSEMENT_RECALAGE; waitingAckFrom = ACKNOWLEDGE_MOTEUR; @@ -1353,49 +1296,49 @@ MV_enchainement++; localData5 = 1; } else { - if(MV_enchainement > 0) {//Utilisé en cas d'enchainement, + if(MV_enchainement > 0) {//Utilisé en cas d'enchainement, localData5 = 2; MV_enchainement = 0; } else { localData5 = 0; } - } + } localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1); GoStraight(localData2, 0, 0, localData5); - - target_x_robot = x_robot + localData2*cos((double)theta_robot*M_PI/1800); + + target_x_robot = x_robot + localData2*cos((double)theta_robot*M_PI/1800); target_y_robot = y_robot + localData2*sin((double)theta_robot*M_PI/1800); target_theta_robot = theta_robot; - - break; + + break; case MV_TURN: //Rotation sur place if(instruction.direction == RELATIVE) { localData2 = instruction.arg3; } else {//C'est un rotation absolu, il faut la convertir en relative localData2 = instruction.arg3; - + localData2 = (localData2 - theta_robot)%3600; if(localData2 > 1800) { localData2 = localData2-3600; } - + } if(InversStrat == 1 && ingnorInversionOnce == 0) { - localData2 = -localData2; - } + localData2 = -localData2; + } waitingAckID = ASSERVISSEMENT_ROTATION; waitingAckFrom = ACKNOWLEDGE_MOTEUR; Rotate(localData2); - - - break; + + + break; case MV_XYT: if(instruction.direction == BACKWARD) { localData1 = -1; } else { localData1 = 1; } - + if(InversStrat == 1 && ingnorInversionOnce == 0) { localData2 = -instruction.arg3; localData3 = 3000 - instruction.arg2;//Inversion du Y @@ -1403,26 +1346,25 @@ localData3 = instruction.arg2; localData2 = instruction.arg3; } - + GoToPosition(instruction.arg1,localData3,localData2,localData1); waitingAckID = ASSERVISSEMENT_XYT; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - - target_x_robot = instruction.arg1; + + target_x_robot = instruction.arg1; target_y_robot = localData3; target_theta_robot = localData2; - - break; + + break; case MV_RECALAGE: - if(instruction.nextActionType == MECANIQUE) - { + if(instruction.nextActionType == MECANIQUE) { instruction.nextActionType = WAIT; - + waitingAckID = ASSERVISSEMENT_RECALAGE; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - + localData2 = (((instruction.direction == FORWARD)?1:-1)*3000);//On indique une distance de 3000 pour etre sur que le robot va ce recaler - + if(instruction.precision == RECALAGE_Y) { localData5 = 2; if(InversStrat == 1 && ingnorInversionOnce == 0) { @@ -1435,78 +1377,70 @@ localData3 = instruction.arg1; } GoStraight(localData2, localData5, localData3, 0); - } - else //CAPTEUR - { + } else { //CAPTEUR SendRawId(DATA_RECALAGE); waitingAckID = RECEPTION_RECALAGE; waitingAckFrom = ACKNOWLEDGE_TELEMETRE; - + // On attend que les variables soient actualisé while(!(waitingAckID == 0 && waitingAckFrom == 0)) canProcessRx(); while(!(waitingAckID_FIN==0 && waitingAckFrom_FIN==0)) canProcessRx(); - - if(instruction.precision == RECALAGE_Y) // ((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600)) (theta_robot < 900 && theta_robot > -900) - { + + if(instruction.precision == RECALAGE_Y) { // ((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600)) (theta_robot < 900 && theta_robot > -900) SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, recalageDistanceY(), theta_robot); + } else if(instruction.precision == RECALAGE_X) { + SetOdometrie(ODOMETRIE_SMALL_POSITION, recalageDistanceX(), y_robot, theta_robot); + } else if(instruction.precision == RECALAGE_T) { + SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, recalageAngulaireCapteur() ); } - else if(instruction.precision == RECALAGE_X) - { - SetOdometrie(ODOMETRIE_SMALL_POSITION, recalageDistanceX(), y_robot, theta_robot); - } - else if(instruction.precision == RECALAGE_T) - { - SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, recalageAngulaireCapteur() ); - } } - break; - + break; + case ACTION: int tempo = 0; waitingAckID= ACK_ACTION; //On veut un ack de type action waitingAckFrom = ACKNOWLEDGE_HERKULEX; //de la part des herkulex tempo = doAction(instruction.arg1,instruction.arg2,instruction.arg3); - if(tempo == 1){ + if(tempo == 1) { //L'action est spécifique if((waitingAckFrom == 0 && waitingAckID == 0) && instruction.nextActionType == ENCHAINEMENT) { actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - } - else { + } else { gameEtat = ETAT_GAME_WAIT_ACK; } - #ifdef ROBOT_SMALL - /*actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante - gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;*/ - #endif +#ifdef ROBOT_SMALL + /*actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante + gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;*/ +#endif return; - #ifdef ROBOT_SMALL +#ifdef ROBOT_SMALL } else if (tempo == 2) { // on est dans le cas de l'avance selon le telemetre waitingAckID = ASSERVISSEMENT_RECALAGE; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - + localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1); GoStraight(telemetreDistance, 0, 0, 0); // on reset la distance du telemetre à 0 telemetreDistance = 5000; - #endif - }else{ +#endif + } else { //C'est un AX12 qu'il faut bouger //AX12_setGoal(instruction.arg1,instruction.arg3/10,instruction.arg2); //AX12_enchainement++; - + } - break; + break; default: //Instruction inconnue, on l'ignore - break; - } - - - + break; + } + + + if(instruction.nextActionType == JUMP || instruction.nextActionType == WAIT) { gameEtat = ETAT_GAME_WAIT_ACK;//Il faut attendre que la carte est bien reçu l'acknowledge screenChecktry++;//On incrèment le conteur de tentative de 1 @@ -1516,35 +1450,31 @@ //AX12_processChange();//Il faut lancer le déplacement des AX12 //AX12_enchainement = 0; } - } - else {//C'est un enchainement - if(instruction.order == MV_LINE){ - gameEtat = ETAT_GAME_WAIT_ACK; - } - else{ + } else { //C'est un enchainement + if(instruction.order == MV_LINE) { + gameEtat = ETAT_GAME_WAIT_ACK; + } else { actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//C'est un enchainement, on charge directement l'instruction suivante } } - - break; + + break; case ETAT_GAME_WAIT_ACK: canProcessRx(); - + if(waitingAckID == 0 && waitingAckFrom == 0) {//Les ack ont été reset, c'est bon on continue - //if(true) { + //if(true) { cartesCheker.stop(); if(instruction.nextActionType == JUMP) { if(instruction.jumpAction == JUMP_POSITION) { gameEtat = ETAT_GAME_JUMP_POSITION; - } - else {//Pour eviter les erreurs, on dit que c'est par défaut un jump time + } else { //Pour eviter les erreurs, on dit que c'est par défaut un jump time gameEtat = ETAT_GAME_JUMP_TIME; cartesCheker.reset();//On reset le timeOut - cartesCheker.start(); + cartesCheker.start(); } - } - else if(instruction.nextActionType == WAIT) { ///Actualisation des waiting ack afin d'attendre la fin des actions + } else if(instruction.nextActionType == WAIT) { ///Actualisation des waiting ack afin d'attendre la fin des actions /*wait_ms(200); #ifdef ROBOT_BIG SetOdometrie(ODOMETRIE_BIG_POSITION, x_robot, y_robot, theta_robot); @@ -1552,177 +1482,170 @@ SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, theta_robot); #endif wait_ms(200);*/ - + gameEtat = ETAT_GAME_WAIT_END_INSTRUCTION; - switch(instruction.order) - { + switch(instruction.order) { case MV_COURBURE: waitingAckID_FIN = ASSERVISSEMENT_COURBURE; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; - break; + break; case MV_LINE: waitingAckID_FIN = ASSERVISSEMENT_RECALAGE; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; - break; + break; case MV_TURN: waitingAckID_FIN = ASSERVISSEMENT_ROTATION; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; - break; + break; case MV_XYT: waitingAckID_FIN = ASSERVISSEMENT_XYT; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; - break; + break; case MV_RECALAGE: waitingAckID_FIN = ASSERVISSEMENT_RECALAGE; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; - break; + break; case ACTION: - - if (modeTelemetre == 0){ - if (telemetreDistance == 0){ - waitingAckID_FIN = ACK_FIN_ACTION;// ack de type action + + if (modeTelemetre == 0) { + if (telemetreDistance == 0) { + waitingAckID_FIN = ACK_FIN_ACTION;// ack de type action waitingAckFrom_FIN = ACKNOWLEDGE_HERKULEX; //de la part des herkulex/actionneurs - }else if(telemetreDistance == 5000){ + } else if(telemetreDistance == 5000) { // on est dans le cas ou l'on fait une ligne suivant la distance du telemetre waitingAckID_FIN = ASSERVISSEMENT_RECALAGE; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; telemetreDistance = 0; } - }else{ // si on attend la reponse du telemetre - //modeTelemetre = 1; + } else { // si on attend la reponse du telemetre + //modeTelemetre = 1; waitingAckID_FIN = OBJET_SUR_TABLE; - waitingAckFrom_FIN = 0; + waitingAckFrom_FIN = 0; } - break; + break; default: - break; - } - } - else { + break; + } + } else { gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante } - } - else if(cartesCheker.read_ms () > 1000){ + } else if(cartesCheker.read_ms () > 1000) { cartesCheker.stop(); if(screenChecktry >=2) {//La carte n'a pas reçus l'information, on passe à l'instruction d'erreur actual_instruction = instruction.nextLineError; gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - } - else { + } else { gameEtat = ETAT_GAME_PROCESS_INSTRUCTION;//On retourne dans l'etat d'envois de l'instruction } } - break; - + break; + case ETAT_GAME_JUMP_TIME: if(cartesCheker.read_ms () >= instruction.JumpTimeOrX) { cartesCheker.stop();//On arrete le timer actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//On charge l'instruction suivante } - break; - + break; + case ETAT_GAME_JUMP_CONFIG: signed int depasX = 1, depasY = 1; // servent à indiquer le sens de dépassement des coordonnées - // 1 si l'instruction est plus grande que la position du robot - // -1 si l'instruction est plus petite que la position du robot - // 0 si l'instruction et position du robot sont proche de moins de 1cm - if (abs(x_robot-instruction.JumpTimeOrX)<10){ - depasX = 0; - }else if(x_robot > instruction.JumpTimeOrX){ - depasX = -1; + // 1 si l'instruction est plus grande que la position du robot + // -1 si l'instruction est plus petite que la position du robot + // 0 si l'instruction et position du robot sont proche de moins de 1cm + if (abs(x_robot-instruction.JumpTimeOrX)<10) { + depasX = 0; + } else if(x_robot > instruction.JumpTimeOrX) { + depasX = -1; } - - if(abs(y_robot-instruction.JumpY)<10){ - depasY = 0; - }else if(y_robot > instruction.JumpY){ - depasY = -1; + + if(abs(y_robot-instruction.JumpY)<10) { + depasY = 0; + } else if(y_robot > instruction.JumpY) { + depasY = -1; } - + gameEtat = ETAT_GAME_JUMP_POSITION; - break; + break; case ETAT_GAME_JUMP_POSITION: bool Xok = false, Yok = false; - - if (depasX == 0){ - Xok = true; - }else if ((instruction.JumpTimeOrX - x_robot)*depasX < -5){ - Xok = true; - } - - if (depasY == 0){ - Yok = true; - }else if ((instruction.JumpY - y_robot)*depasY < -5){ - Yok = true; - } - - // on teste si les deux coordonnées ont été dépassées, si oui on lance l'instruction suivante - if (Xok && Yok){ - actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante - gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//On charge l'instruction suivante - } - - break; + + if (depasX == 0) { + Xok = true; + } else if ((instruction.JumpTimeOrX - x_robot)*depasX < -5) { + Xok = true; + } + + if (depasY == 0) { + Yok = true; + } else if ((instruction.JumpY - y_robot)*depasY < -5) { + Yok = true; + } + + // on teste si les deux coordonnées ont été dépassées, si oui on lance l'instruction suivante + if (Xok && Yok) { + actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante + gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//On charge l'instruction suivante + } + + break; case ETAT_GAME_WAIT_END_INSTRUCTION: - canProcessRx(); + canProcessRx(); if(waitingAckID_FIN == 0 && waitingAckFrom_FIN ==0) {//On attend que la carte nous indique que l'instruction est terminée actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//On charge l'instruction suivante } - - break; - - + + break; + + case ETAT_WARNING_TIMEOUT://Attente de la trame fin de danger ou du timeout de 2s - if(timeoutWarning.read_ms() >= BALISE_TIMEOUT)//ça fait plus de 2s, il faut changer de stratégie - { + if(timeoutWarning.read_ms() >= BALISE_TIMEOUT) { //ça fait plus de 2s, il faut changer de stratégie + gameEtat = ETAT_EVITEMENT; + if(Fevitement==1) { + EvitEtat= 0; + Fevitement=0; + } + + /*------------------------------------- + code origine + if(instruction.nextLineOK != instruction.nextLineError) { actual_instruction = instruction.nextLineError; gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - } + }----------------------------------------*/ + } - break; + break; + + + + case ETAT_WARING_END_BALISE_WAIT://Attente d'une seconde apres la fin d'un End Balise pour etre sur que c'est bon if(timeoutWarningWaitEnd.read_ms() >= 1000) {//c'est bon, on repart //actual_instruction = instruction.nextLineError; gameEtat = ETAT_WARNING_END_LAST_INSTRUCTION; } - break; + break; case ETAT_WARNING_END_LAST_INSTRUCTION://trouver le meilleur moyen de reprendre l'instruction en cours -/* -#ifdef ROBOT_BIG - actual_instruction = instruction.nextLineError;// 2 //Modification directe... c'est pas bien mais ça marchait pour le match 5 - gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; -#else - actual_instruction = instruction.nextLineError; - gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; -#endif - gameEtat = ETAT_END;*/ - - /*wait_ms(200); - #ifdef ROBOT_BIG - SetOdometrie(ODOMETRIE_BIG_POSITION, x_robot, y_robot, theta_robot); - #else - SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, theta_robot); - #endif - wait_ms(200);*/ - - switch(actionPrecedente){ + + + switch(actionPrecedente) { case MV_LINE: - + if(instruction.direction == BACKWARD) { localData1 = -1; } else { localData1 = 1; } - + GoToPosition(target_x_robot,target_y_robot,target_theta_robot,localData1); debugXYTTarget(target_x_robot,target_y_robot,target_theta_robot); waitingAckID = ASSERVISSEMENT_XYT; waitingAckFrom = ACKNOWLEDGE_MOTEUR; - gameEtat = ETAT_GAME_WAIT_ACK; + gameEtat = ETAT_GAME_WAIT_ACK; instruction.order = MV_XYT; instruction.arg1 = target_x_robot; instruction.arg2 = target_y_robot; @@ -1730,115 +1653,319 @@ instruction.direction = (localData1)?FORWARD:BACKWARD; ingnorInversionOnce = 1;//Pour éviter que l'ago recalcul l'inversion return; - + case MV_XYT: - gameEtat = ETAT_GAME_PROCESS_INSTRUCTION; + gameEtat = ETAT_GAME_PROCESS_INSTRUCTION; ///////cv break; - + case MV_COURBURE: //target_theta_robot = theta_robot - target_theta_robot; //instruction.arg3 = instruction.arg3 - target_theta_robot; - if(instruction.direction == LEFT){ + if(instruction.direction == LEFT) { target_theta_robot = target_theta_robot - theta_robot; - }else{ + } else { target_theta_robot = theta_robot + target_theta_robot; } - - + + target_theta_robot = (target_theta_robot)%3600; if(target_theta_robot > 1800) { target_theta_robot = target_theta_robot-3600; } - if(InversStrat == 1) { + if(InversStrat == 1) { target_theta_robot = -target_theta_robot; } instruction.arg3 = target_theta_robot; - - - gameEtat = ETAT_GAME_PROCESS_INSTRUCTION; - + + + gameEtat = ETAT_GAME_PROCESS_INSTRUCTION; + break; default: actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - break; + break; } - + //actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante //gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; - break; + break; case ETAT_WARNING_SWITCH_STRATEGIE://Si à la fin du timeout il y a toujours un robot, passer à l'instruction d'erreur actual_instruction = instruction.nextLineError; gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; ingnorBaliseOnce = 1; - break; - + break; + case ETAT_EVITEMENT : - E_Evitement EvitEtat= ETAT_INIT_EVITEMENT; - while(1) - { - canProcessRx(); - - switch(EvitEtat) - { - case ETAT_INIT_EVITEMENT: - EvitEtat = ETAT_ESTIMATION_POSITION; - break; + + /*disposition des waypoint sur le terrain + on considère le terrain comme un rectangle de 3m par 1m50 , on exclus la zone de la rampe + ______________ + | | format(x,y)en mm + Y| x x | (1000, 2250) (1500 , 2250) + | | + | x x | (1000 , 1500) (1500 , 1500) + | | + | x x | (1000 , 750) (1500 , 750) + | | + |______________| + X--> + */ + static short x_terrain=3000; + static short y_terrain=1500; + + static float x_cote_droit[3]= {0}; + static float y_cote_droit[3]= {0}; + static float x_cote_gauche[3]= {0}; + static float y_cote_gauche[3]= {0}; + static short cote=0; +//--------------------------- + /* short x_robot=500; + short y_robot=500; + short theta_robot=0; + //--------------------------- + short target_x_robot=2000; + short target_y_robot=1000; + short target_theta_robot=1000;*/ +//-------------------------- + float dist_robot_adversaire=650;//distance à laquelle on s'arrete grace à la balise + int proxy=400;//distance entre point de controle et obstacle/adversaire + int proximity=400;//distance entre l'objectif et obstacle/adversaire + short taille_petit=150;// distance proxymité max mur +//---------------------------* + static unsigned short distance=50000;//valeur impossible + static unsigned short distance_prev=50000; + static unsigned short theta1,theta2,theta_adversaire; + + switch(EvitEtat) { + case 0: + + /*SendRawId(DATA_RECALAGE); + wait(0.1); + canProcessRx(); + unsigned short distance_adverse=telemetreDistance_arriere_gauche; //on sauvegarde notre distance au robot + */ + ingnorBalise=1; + Rotate(300); //on tourne a gauche pour scanner + waitingAckID = ASSERVISSEMENT_ROTATION; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + + waitingAckID_FIN = ASSERVISSEMENT_ROTATION; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN !=0 && waitingAckFrom_FIN !=0) { + canProcessRx(); + SendRawId(DATA_RECALAGE); + distance=telemetreDistance_arriere_gauche; //on sauvegarde notre distance au robot + if(distance<=distance_prev) { + distance_prev=distance; + theta1=theta_robot; + } + } + Rotate(-600);//on tourne a droite pour scanner + waitingAckID = ASSERVISSEMENT_ROTATION; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + + waitingAckID_FIN = ASSERVISSEMENT_ROTATION; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN !=0 && waitingAckFrom_FIN !=0) + canProcessRx(); - case ETAT_ESTIMATION_POSITION : - /*wait_ms(100); - Rotate(3600); - EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK; - waitingAckID = ASSERVISSEMENT_ROTATION; - waitingAckFrom = ACKNOWLEDGE_MOTEUR;*/ - GoToPosition(1400,300,0,1); - waitingAckID = ASSERVISSEMENT_XYT; - waitingAckFrom = ACKNOWLEDGE_MOTEUR; - break; - - case ETAT_ESTIMATION_POSITION_ROTATION_ACK: - if(waitingAckID == 0 && waitingAckFrom == 0) - { - EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK_END; + Rotate(300);//on revien au centre + waitingAckID = ASSERVISSEMENT_ROTATION; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + + waitingAckID_FIN = ASSERVISSEMENT_ROTATION; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN !=0 && waitingAckFrom_FIN !=0) { + canProcessRx(); + SendRawId(DATA_RECALAGE); + distance=telemetreDistance_arriere_gauche; //on sauvegarde notre distance au robot + if(distance<=distance_prev) { + distance_prev=distance; + theta2=theta_robot; + } + } + theta_adversaire=(theta1+theta2)/2;//version avec telemetre + //theta_adversaire=theta_robot;//version sans telemetre (robot en face + + short ang_target = (short)((atan2((float)(target_y_robot - y_robot), (float)(target_x_robot - x_robot)) * 1800 / M_PI) - theta_robot + 7200) % 3600; + // On passe le résultat entre -1800 et 1800 + if (ang_target > 1800) ang_target = (ang_target- 3600); + + // float dist_target = (short)sqrt((target_x_robot - x_robot)*(target_x_robot - x_robot)+(target_y_robot - y_robot)*(target_y_robot - y_robot)); + + float x_robot_adversaire = x_robot + (dist_robot_adversaire)*cos((float)(theta_adversaire)* M_PI/1800); + float y_robot_adversaire = y_robot + (dist_robot_adversaire)*sin((float)(theta_adversaire)*M_PI/1800); + + x_cote_droit[0] = x_robot_adversaire + (proxy)*cos((float)(theta_adversaire+ang_target+1300)*M_PI/1800); + y_cote_droit[0] = y_robot_adversaire + (proxy)*sin((float)(theta_adversaire+ang_target+1300)*M_PI/1800); + x_cote_gauche[0] = x_robot_adversaire + (proxy)*cos((float)(theta_adversaire+ang_target-1300)*M_PI/1800); + y_cote_gauche[0] = y_robot_adversaire + (proxy)*sin((float)(theta_adversaire+ang_target-1300)*M_PI/1800); + + x_cote_droit[1] = x_robot_adversaire + (proxy)*cos((float)(theta_adversaire+ang_target+900)*M_PI/1800); + y_cote_droit[1] = y_robot_adversaire + (proxy)*sin((float)(theta_adversaire+ang_target+900)*M_PI/1800); + x_cote_gauche[1] = x_robot_adversaire + (proxy)*cos((float)(theta_adversaire+ang_target-900)*M_PI/1800); + y_cote_gauche[1] = y_robot_adversaire + (proxy)*sin((float)(theta_adversaire+ang_target-900)*M_PI/1800); + + x_cote_droit[2] = x_robot_adversaire + (proxy)*cos((float)(theta_adversaire+ang_target+500)*M_PI/1800); + y_cote_droit[2] = y_robot_adversaire + (proxy)*sin((float)(theta_adversaire+ang_target+500)*M_PI/1800); + x_cote_gauche[2] = x_robot_adversaire + (proxy)*cos((float)(theta_adversaire+ang_target-500)*M_PI/1800); + y_cote_gauche[2] = y_robot_adversaire + (proxy)*sin((float)(theta_adversaire+ang_target-500)*M_PI/1800); + + SendRawId(0x0D0);//calcul + + //for(int i=0; i<3; i++) printf("point:%d | gauche(%.1f , %.1f) | droite(%.1f , %.1f)\n\r",i,x_cote_gauche[i],y_cote_gauche[i],x_cote_droit[i],y_cote_droit[i]) ; + //printf("------------\n\r"); + //-------------------------process------------------------------------------------ + + bool cote_droit=false, cote_gauche=false; + + + for (int i=0; i<3; i++) { + if (x_cote_droit[i]>taille_petit && x_cote_droit[i]<x_terrain-taille_petit && y_cote_droit[i] >taille_petit && y_cote_droit[i] < y_terrain-taille_petit) { + cote_droit=true; + cote=1; + } else { + cote_droit=false; + break; + } + + if (x_cote_gauche[i]>taille_petit && x_cote_gauche[i]<x_terrain-taille_petit && y_cote_gauche[i] >taille_petit && y_cote_gauche[i] < y_terrain-taille_petit) { + cote_gauche=true; + cote=-1; + } else { + cote_gauche=false; + break; + } + } + + if(!cote_droit && !cote_gauche)cote=0; + + if (cote_droit && cote_gauche) { + if (ang_target<=0) { + cote = -1;// cote gauche + SendRawId(0x1D0); + } else if (ang_target>0) { + cote = 1; //cote droite + SendRawId(0x2D0); + } + } + + if ( ang_target>600 || ang_target<-600)cote=0; + + + if (!cote_droit && !cote_gauche) { + cote=0; + } + + //--------------------test target -------------------------------------- + + if ((x_robot_adversaire >= target_x_robot-proximity && x_robot_adversaire <= target_x_robot+proximity)&&(y_robot_adversaire >= target_y_robot-proximity && y_robot_adversaire <= target_y_robot+proximity)) cote=0; + + + EvitEtat = 1; + + break; + + case 1 ://on attend la fin de la première rotation pour activer la balise + //ingnorBalise=1; + SendRawId(0x0D1);//init evitement + if(cote!=0) { + for(int i=0; i<3; i++) { + if(cote==-1) { + GoToPosition(y_cote_droit[i],x_cote_droit[i],theta_robot,1);// + SendRawId(0x1D1);//evitement a gauche + } else if(cote==1) { + GoToPosition(y_cote_gauche[i],x_cote_gauche[i],theta_robot,1); + SendRawId(0x2D1);//evitement a droite + } + waitingAckID = ASSERVISSEMENT_XYT; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + + Fevitement=1; + ingnorBalise=1; + waitingAckID_FIN = ASSERVISSEMENT_XYT_ROTATE; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + + ingnorBalise=0; + waitingAckID_FIN = ASSERVISSEMENT_XYT_LINE; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN !=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + + ingnorBalise=1; waitingAckID_FIN = ASSERVISSEMENT_XYT; waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN !=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + } - break; - - case ETAT_ESTIMATION_POSITION_ROTATION_ACK_END: - if(waitingAckID == 0 && waitingAckFrom == 0) - EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK_END; - break; - - case ETAT_FIN_EVITEMENT: - gameEtat = ETAT_WARNING_END_LAST_INSTRUCTION; - break; - } + } else { + SendRawId(0x3D1);//cote=0 evitement non possible + EvitEtat=0; + gameEtat=ETAT_WARNING_END_LAST_INSTRUCTION; + ingnorBalise=0; + Fevitement=0; + } + EvitEtat=2; + break; + + case 2: + SendRawId(0x0D2); + GoToPosition(target_x_robot,target_y_robot,target_theta_robot,1); + waitingAckID = ASSERVISSEMENT_XYT; + waitingAckFrom = ACKNOWLEDGE_MOTEUR; + while(waitingAckID !=0 && waitingAckFrom !=0) + canProcessRx(); + + Fevitement=1; + waitingAckID_FIN = ASSERVISSEMENT_XYT; + waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; + while(waitingAckID_FIN !=0 && waitingAckFrom_FIN !=0) + canProcessRx(); + + EvitEtat=3; + break; + + case 3: //on charge l'instruction suivante et sort de l'evitement + actual_instruction++;//on charge l'instruction suivante + gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; + EvitEtat = 0; + ingnorBalise=0; + Fevitement=0; + break; } - - + break; - - - - case ETAT_END: - if (ModeDemo){ + + case ETAT_END: + if (ModeDemo) { gameEtat = ETAT_CHECK_CARTE_SCREEN; ModeDemo = 1; } else { gameEtat = ETAT_END_LOOP; } - break; + break; case ETAT_END_LOOP: //Rien, on tourne en rond - - break; + + break; default: - - break; - } -} + + break; + } +} @@ -1863,27 +1990,27 @@ if(FIFO_occupation!=0) { int identifiant=msgRxBuffer[FIFO_lecture].id; switch(identifiant) { - + case ALIVE_MOTEUR: - if (etat == ATT) { - - lcd.SetTextColor(LCD_COLOR_LIGHTGREEN); - lcd.FillRect(0,400,400,150); - lcd.SetTextColor(LCD_COLOR_BLACK); - lcd.SetBackColor(LCD_COLOR_LIGHTGREEN); - lcd.DisplayStringAt(80, 450, (uint8_t *)"Carte Moteur", LEFT_MODE); + if (etat == ATT) { + + lcd.SetTextColor(LCD_COLOR_LIGHTGREEN); + lcd.FillRect(0,400,400,150); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.SetBackColor(LCD_COLOR_LIGHTGREEN); + lcd.DisplayStringAt(80, 450, (uint8_t *)"Carte Moteur", LEFT_MODE); } break; - + case ALIVE_BALISE: - if (etat == ATT) { - - lcd.SetTextColor(LCD_COLOR_LIGHTGREEN); - lcd.FillRect(0,600,400,150); //carte AX12 - lcd.SetTextColor(LCD_COLOR_BLACK); - lcd.SetBackColor(LCD_COLOR_LIGHTGREEN); - lcd.DisplayStringAt(110, 650, (uint8_t *)"Balise", LEFT_MODE); - } + if (etat == ATT) { + + lcd.SetTextColor(LCD_COLOR_LIGHTGREEN); + lcd.FillRect(0,600,400,150); //carte AX12 + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.SetBackColor(LCD_COLOR_LIGHTGREEN); + lcd.DisplayStringAt(110, 650, (uint8_t *)"Balise", LEFT_MODE); + } break; case RESET_IHM: @@ -1896,8 +2023,8 @@ gameEtat = ETAT_GAME_START; SendRawId(ACKNOWLEDGE_JACK); } - break; - + break; + case ALIVE_ACTIONNEURS_AVANT: //pas de break donc passe directement dans ECRAN_ALL_CHECK mais conserve l'ident initial case ALIVE_ACTIONNEURS_ARRIERE: case ALIVE_HERKULEX: @@ -1906,31 +2033,59 @@ waitingAckFrom = 0;//C'est la bonne carte qui indique qu'elle est en ligne } flag=1; - break; - - - - - /////////////////////////////////////Acknowledges de Reception de la demande d'action//////////////////////////////////////// - case ACKNOWLEDGE_HERKULEX: + break; + + + + + /////////////////////////////////////Acknowledges de Reception de la demande d'action//////////////////////////////////////// + case ACKNOWLEDGE_HERKULEX: case ACKNOWLEDGE_BALISE: //pas de break donc passe directement dans ACK_FIN_ACTION mais conserve l'ident initial - - case ACKNOWLEDGE_TELEMETRE: - /////////////////////////////////////////////Acknowledges de la fin d'action///////////////////////////////////////////////// + + case ACKNOWLEDGE_TELEMETRE: + /////////////////////////////////////////////Acknowledges de la fin d'action///////////////////////////////////////////////// case ACKNOWLEDGE_MOTEUR: case INSTRUCTION_END_BALISE: + case ACK_FIN_ACTION: case INSTRUCTION_END_MOTEUR: - case ACK_FIN_ACTION: - if(waitingAckFrom == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID)) { + unsigned short recieveAckID;// = (unsigned short)msgRxBuffer[FIFO_lecture].data[0] | ( ((unsigned short)msgRxBuffer[FIFO_lecture].data[1]) <<8); + memcpy(&recieveAckID, msgRxBuffer[FIFO_lecture].data, 2); + Send2Short(0x5D7,waitingAckFrom_FIN, waitingAckID_FIN); + Send2Short(0x5D8,msgRxBuffer[FIFO_lecture].id, recieveAckID); + + if( waitingAckFrom == msgRxBuffer[FIFO_lecture].id && recieveAckID == waitingAckID ) { waitingAckFrom = 0; - waitingAckID = 0; + waitingAckID = 0; + } + if( waitingAckFrom_FIN == msgRxBuffer[FIFO_lecture].id && recieveAckID == waitingAckID_FIN ) { + //SendRawId(0x5D9); + waitingAckFrom_FIN = 0; + waitingAckID_FIN = 0; } - if(waitingAckFrom_FIN == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID_FIN)) { - waitingAckFrom_FIN = 0; - waitingAckID_FIN = 0; - } - - break; + + /* + if((waitingAckFrom == msgRxBuffer[FIFO_lecture].id) && + ((unsigned short)msgRxBuffer[FIFO_lecture].data[0] | (((unsigned short)msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID) ) + { + waitingAckFrom = 0; + waitingAckID = 0; + } + if(waitingAckFrom_FIN == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0] + |(((unsigned short)msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID_FIN)) + { + waitingAckFrom_FIN = 0; + waitingAckID_FIN = 0; + } + */ + break; + + + + + + + + #ifdef ROBOT_BIG case ODOMETRIE_BIG_POSITION: #else @@ -1939,72 +2094,78 @@ x_robot=msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8); y_robot=msgRxBuffer[FIFO_lecture].data[2]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[3])<<8); theta_robot=msgRxBuffer[FIFO_lecture].data[4]|((signed short)(msgRxBuffer[FIFO_lecture].data[5])<<8); - break; - + break; + case ACK_ACTION: if(waitingAckID == msgRxBuffer[FIFO_lecture].id) { waitingAckFrom = 0; waitingAckID = 0; } break; - + case BALISE_DANGER : SendAck(ACKNOWLEDGE_BALISE, BALISE_END_DANGER); - break; - + break; + case BALISE_STOP: SendAck(ACKNOWLEDGE_BALISE, BALISE_STOP); - + signed char fin_angle_detection = msgRxBuffer[FIFO_lecture].data[0] & 0x0F; - signed char debut_angle_detection = (msgRxBuffer[FIFO_lecture].data[0] & 0xF0) >> 4; - - if(debut_angle_detection > fin_angle_detection) - { + signed char debut_angle_detection = (msgRxBuffer[FIFO_lecture].data[0] & 0xF0) >> 4; + + + + + if(debut_angle_detection > fin_angle_detection) { angle_moyen_balise_IR = (float)debut_angle_detection + ((15.0f-(float)debut_angle_detection)+(float)fin_angle_detection)/2.0f; if(angle_moyen_balise_IR > 15.0f) angle_moyen_balise_IR-=15.0f; - } - else + } else angle_moyen_balise_IR = debut_angle_detection + (fin_angle_detection-debut_angle_detection)/2; - - #ifdef ROBOT_BIG + +#ifdef ROBOT_BIG float seuil_bas_avant = 12.0; // >= float seuil_haut_avant = 0.0; // <= float seuil_bas_arriere = 4.0; float seuil_haut_arriere = 8.0; - #else +#else float seuil_bas_avant = 13.0; float seuil_haut_avant = 15.0; float seuil_bas_arriere = 5.0; float seuil_haut_arriere = 7.0; - #endif - - if (instruction.order == MV_LINE && instruction.direction == FORWARD && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant - || instruction.order == MV_LINE && instruction.direction == BACKWARD && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= 7 - || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant - || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere - || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant - || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere ){ //J'ai rajouté cette ligne mais il faut tester avec et sans pour voir le comportement du robot, - if(needToStop() != 0 && ingnorBaliseOnce ==0) { - if(gameEtat > ETAT_GAME_START && gameEtat != ETAT_WARNING_TIMEOUT) - { +#endif + + + + if (instruction.order == MV_LINE && instruction.direction == FORWARD && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant + || instruction.order == MV_LINE && instruction.direction == BACKWARD && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere + || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant + || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere + || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant + || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= seuil_haut_arriere ) { //J'ai rajouté cette ligne mais il faut tester avec et sans pour voir le comportement du robot, + + + if(needToStop() != 0 && ingnorBaliseOnce ==0 && ingnorBalise==0) { + if(gameEtat > ETAT_GAME_START && gameEtat != ETAT_WARNING_TIMEOUT) { + SendRawId(0x0D9);//balise_stop SendRawId(ASSERVISSEMENT_STOP); //while(1); // ligne à décommenter si on est en homologation if(gameEtat != ETAT_WARING_END_BALISE_WAIT) { timeoutWarning.reset(); timeoutWarning.start();//Reset du timer utiliser par le timeout } + //stop_evitement=1; gameEtat = ETAT_WARNING_TIMEOUT; } } - + + + + } - - - ingnorBaliseOnce = 0; - break; - + break; + case BALISE_END_DANGER: SendAck(ACKNOWLEDGE_BALISE, BALISE_END_DANGER); if(gameEtat == ETAT_WARNING_TIMEOUT) { @@ -2012,79 +2173,78 @@ timeoutWarningWaitEnd.start(); gameEtat = ETAT_WARING_END_BALISE_WAIT; } - break; - + break; + /*case OBJET_SUR_TABLE: if (msgRxBuffer[FIFO_lecture].data[1] == 0xff){ - + gameEtat = ETAT_WARNING_END_LAST_INSTRUCTION; } else{ - + waitingAckFrom = 0; - waitingAckID = 0; - + waitingAckID = 0; + strat_instructions[actual_instruction+1].arg1 = returnX(strat_instructions[actual_instruction].arg2); strat_instructions[actual_instruction+1].arg2 = returnY(strat_instructions[actual_instruction].arg2); } modeTelemetre = 0; break;*/ - + case RECEPTION_DATA: telemetreDistance=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]); telemetreDistance= (float)telemetreDistance*100.0f*35.5f+50.0f; waitingAckFrom = 0; waitingAckID = 0; break; - + case RECEPTION_RECALAGE: - telemetreDistance_arriere_droite = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]); // + telemetreDistance_arriere_droite = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]); //on récupère la distance traité par l'autre micro telemetreDistance_avant_droite = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[2], msgRxBuffer[FIFO_lecture].data[3]); telemetreDistance_arriere_gauche = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[4], msgRxBuffer[FIFO_lecture].data[5]); telemetreDistance_avant_gauche = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[6], msgRxBuffer[FIFO_lecture].data[7]); - - - - if(ModeDemo==1) - { + + + + if(ModeDemo==1) { sprintf(message,"%04d mm",telemetreDistance_arriere_droite); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(10),(unsigned char *)"LASER ARD : ",LEFT_MODE); lcd.DisplayStringAt(200, LINE(10),(unsigned char *)message, LEFT_MODE); - + sprintf(message1,"%04d mm",telemetreDistance_avant_droite); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(12),(unsigned char *)"LASER AVD : ",LEFT_MODE); lcd.DisplayStringAt(200, LINE(12),(unsigned char *)message1, LEFT_MODE); - + sprintf(message2,"%04d mm",telemetreDistance_arriere_gauche); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(14),(unsigned char *)"LASER ARG : ",LEFT_MODE); lcd.DisplayStringAt(200, LINE(14),(unsigned char *)message2, LEFT_MODE); - + sprintf(message3,"%04d mm",telemetreDistance_avant_gauche); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(16),(unsigned char *)"LASER AVG : ",LEFT_MODE); - lcd.DisplayStringAt(200, LINE(16),(unsigned char *)message3, LEFT_MODE); + lcd.DisplayStringAt(200, LINE(16),(unsigned char *)message3, LEFT_MODE); } break; - + case RECEPTION_COULEUR: - if (blocage_balise==0){ - couleur1=msgRxBuffer[FIFO_lecture].data[0]; - couleur2=msgRxBuffer[FIFO_lecture].data[1]; - couleur3=msgRxBuffer[FIFO_lecture].data[2]; - - /*lcd.DisplayStringAt(0,LINE(16),(unsigned char *)couleur1+'0',LEFT_MODE); - lcd.DisplayStringAt(0,LINE(16+1),(unsigned char *)couleur2+'0',LEFT_MODE); - lcd.DisplayStringAt(0,LINE(16+2),(unsigned char *)couleur3+'0',LEFT_MODE);*/ + if (blocage_balise==0) { + couleur1=msgRxBuffer[FIFO_lecture].data[0]; + couleur2=msgRxBuffer[FIFO_lecture].data[1]; + couleur3=msgRxBuffer[FIFO_lecture].data[2]; + + /*lcd.DisplayStringAt(0,LINE(16),(unsigned char *)couleur1+'0',LEFT_MODE); + lcd.DisplayStringAt(0,LINE(16+1),(unsigned char *)couleur2+'0',LEFT_MODE); + lcd.DisplayStringAt(0,LINE(16+2),(unsigned char *)couleur3+'0',LEFT_MODE);*/ } - - break; - + + break; + case NO_BLOC: //il n'y a pas de bloc, on saute les étapes liées à l'attrape bloc actual_instruction = instruction.nextLineError; - gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; + gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION; /*waitingAckID_FIN=0; waitingAckFrom_FIN=0;*/ SendRawId(0x40); @@ -2103,7 +2263,7 @@ /* DESCRIPTION : Sélection de la strat sur le lcd puis envoie sur CAN (à modifier!) */ /****************************************************************************************/ signed char Bouton_Strat (void) -{ +{ Button STRAT_1 (0, 30, 190, 110, strat_sd[0]); Button STRAT_2 (210, 30, 190, 110, strat_sd[1]); Button STRAT_3 (0, 150, 190, 110, strat_sd[2]); @@ -2116,7 +2276,7 @@ Button STRAT_10 (210, 510, 190, 110, strat_sd[9]); Button RETOUR (0, 680, 400, 110, "--Precedent--"); //Definition des boutons - + Ack_strat = 0; Strat = 0; STRAT_1.Draw(0xFFF0F0F0, 0); @@ -2127,102 +2287,101 @@ STRAT_6.Draw(0xFFF0F0F0, 0); STRAT_7.Draw(0xFFF0F0F0, 0); STRAT_8.Draw(0xFFF0F0F0, 0); - STRAT_9.Draw(0xFFF0F0F0, 0); - STRAT_10.Draw(0xFFF0F0F0, 0); + STRAT_9.Draw(0xFFF0F0F0, 0); + STRAT_10.Draw(0xFFF0F0F0, 0); RETOUR.Draw(0xFFFF0000, 0); - - while(Ack_strat == 0) - { + + while(Ack_strat == 0) { canProcessRx(); CANMessage msgTx=CANMessage(); //msgTx.id=ECRAN_CHOICE_STRAT; if (RETOUR.Touched()) return -1; while(RETOUR.Touched()); - //////////////////////////////STRATEGIE N°1 - if (STRAT_1.Touched()){ - Strat = 0; - //msgTx.data[0] = 0x1; - //can2.write(msgTx); - while(STRAT_1.Touched()); - Ack_strat =1; - } - /////////////////////////////STRATEGIE N°2 - if (STRAT_2.Touched()){ - Strat = 1; - //msgTx.data[0] = 0x2; - //can2.write(msgTx); - while(STRAT_2.Touched()); - Ack_strat =1; - } - //////////////////////////////STRATEGIE N°3 - if (STRAT_3.Touched()){ - Strat = 2; - //msgTx.data[0] = 0x3; - //can2.write(msgTx); - while(STRAT_3.Touched()); - Ack_strat =1; - } - /////////////////////////////STRATEGIE N°4 - if (STRAT_4.Touched()){ - Strat = 3; - //msgTx.data[0] = 0x4; - //can2.write(msgTx); - while(STRAT_4.Touched()); - Ack_strat =1; - } - ///////////////////////////////STRATEGIE N°5 - if (STRAT_5.Touched()){ - Strat = 4; - //msgTx.data[0] = 0x5; - //can2.write(msgTx); - while(STRAT_5.Touched()); - Ack_strat =1; - } - ////////////////////////////////STRATEGIE N°6 - if (STRAT_6.Touched()){ - Strat = 5; - //msgTx.data[0] = 0x6; - //can2.write(msgTx); - while(STRAT_6.Touched()); - Ack_strat =1; - } - /////////////////////////////////STRATEGIE N°7 - if (STRAT_7.Touched()){ - Strat = 6; - //msgTx.data[0] = 0x7; - //can2.write(msgTx); - while(STRAT_7.Touched()); - Ack_strat =1; - } - /////////////////////////////////STRATEGIE N°8 - if (STRAT_8.Touched()){ - Strat = 7; - //msgTx.data[0] = 0x8; - //can2.write(msgTx); - while(STRAT_8.Touched()); - Ack_strat =1; - } - /////////////////////////////////STRATEGIE N°9 - if (STRAT_9.Touched()){ - Strat = 8; - //msgTx.data[0] = 0x9; - //can2.write(msgTx); - while(STRAT_9.Touched()); - Ack_strat =1; - } - ///////////////////////////////////STRATEGIE N°10 - if (STRAT_10.Touched()){ - Strat = 9; - //msgTx.data[0] = 0xA; - //can2.write(msgTx); - while(STRAT_10.Touched()); - Ack_strat =1; - } - + //////////////////////////////STRATEGIE N°1 + if (STRAT_1.Touched()) { + Strat = 0; + //msgTx.data[0] = 0x1; + //can2.write(msgTx); + while(STRAT_1.Touched()); + Ack_strat =1; + } + /////////////////////////////STRATEGIE N°2 + if (STRAT_2.Touched()) { + Strat = 1; + //msgTx.data[0] = 0x2; + //can2.write(msgTx); + while(STRAT_2.Touched()); + Ack_strat =1; + } + //////////////////////////////STRATEGIE N°3 + if (STRAT_3.Touched()) { + Strat = 2; + //msgTx.data[0] = 0x3; + //can2.write(msgTx); + while(STRAT_3.Touched()); + Ack_strat =1; + } + /////////////////////////////STRATEGIE N°4 + if (STRAT_4.Touched()) { + Strat = 3; + //msgTx.data[0] = 0x4; + //can2.write(msgTx); + while(STRAT_4.Touched()); + Ack_strat =1; + } + ///////////////////////////////STRATEGIE N°5 + if (STRAT_5.Touched()) { + Strat = 4; + //msgTx.data[0] = 0x5; + //can2.write(msgTx); + while(STRAT_5.Touched()); + Ack_strat =1; + } + ////////////////////////////////STRATEGIE N°6 + if (STRAT_6.Touched()) { + Strat = 5; + //msgTx.data[0] = 0x6; + //can2.write(msgTx); + while(STRAT_6.Touched()); + Ack_strat =1; + } + /////////////////////////////////STRATEGIE N°7 + if (STRAT_7.Touched()) { + Strat = 6; + //msgTx.data[0] = 0x7; + //can2.write(msgTx); + while(STRAT_7.Touched()); + Ack_strat =1; + } + /////////////////////////////////STRATEGIE N°8 + if (STRAT_8.Touched()) { + Strat = 7; + //msgTx.data[0] = 0x8; + //can2.write(msgTx); + while(STRAT_8.Touched()); + Ack_strat =1; + } + /////////////////////////////////STRATEGIE N°9 + if (STRAT_9.Touched()) { + Strat = 8; + //msgTx.data[0] = 0x9; + //can2.write(msgTx); + while(STRAT_9.Touched()); + Ack_strat =1; + } + ///////////////////////////////////STRATEGIE N°10 + if (STRAT_10.Touched()) { + Strat = 9; + //msgTx.data[0] = 0xA; + //can2.write(msgTx); + while(STRAT_10.Touched()); + Ack_strat =1; + } + } - return Strat; - + return Strat; + } void affichage_compteur (int nombre) @@ -2233,16 +2392,16 @@ unite = nombre-(10*dizaine); print_segment(unite,-50); print_segment(dizaine,100); - if(centaine!=0){ + if(centaine!=0) { print_segment(centaine,350); } - + } //****print_segment*** //Dessine en 7 segment le nombre en parametre -// A +// A // ===== // | | // B | G | E @@ -2254,7 +2413,7 @@ /* position pour le chiffre des unites lcd.FillRect(460,75,120,25);// A -lcd.FillRect(435,100,25,120);// B +lcd.FillRect(435,100,25,120);// B lcd.FillRect(435,245,25,120);// C lcd.FillRect(460,365,120,25);// D lcd.FillRect(580,100,25,120);// E @@ -2263,97 +2422,96 @@ position pour le chiffre des dizaines lcd.FillRect(260,75,120,25);// A -lcd.FillRect(235,100,25,120);// B +lcd.FillRect(235,100,25,120);// B lcd.FillRect(235,245,25,120);// C lcd.FillRect(260,365,120,25);// D lcd.FillRect(380,100,25,120);// E lcd.FillRect(380,245,25,120);// F lcd.FillRect(260,220,120,25);// G */ - + void print_segment(int nombre, int decalage) -{ - - switch(nombre) - { +{ + + switch(nombre) { case 0: - lcd.FillRect(240-decalage,75,120,25); - lcd.FillRect(215-decalage,100,25,120); - lcd.FillRect(215-decalage,245,25,120); - lcd.FillRect(360-decalage,245,25,120); - lcd.FillRect(360-decalage,100,25,120); - lcd.FillRect(240-decalage,365,120,25); - break; - + lcd.FillRect(240-decalage,75,120,25); + lcd.FillRect(215-decalage,100,25,120); + lcd.FillRect(215-decalage,245,25,120); + lcd.FillRect(360-decalage,245,25,120); + lcd.FillRect(360-decalage,100,25,120); + lcd.FillRect(240-decalage,365,120,25); + break; + case 1: - lcd.FillRect(360-decalage,100,25,120);// E - lcd.FillRect(360-decalage,245,25,120);// F - break; - + lcd.FillRect(360-decalage,100,25,120);// E + lcd.FillRect(360-decalage,245,25,120);// F + break; + case 2: - lcd.FillRect(240-decalage,75,120,25);// A - lcd.FillRect(215-decalage,245,25,120);// C - lcd.FillRect(240-decalage,365,120,25);// D - lcd.FillRect(360-decalage,100,25,120);// E - lcd.FillRect(240-decalage,220,120,25);// G - break; - + lcd.FillRect(240-decalage,75,120,25);// A + lcd.FillRect(215-decalage,245,25,120);// C + lcd.FillRect(240-decalage,365,120,25);// D + lcd.FillRect(360-decalage,100,25,120);// E + lcd.FillRect(240-decalage,220,120,25);// G + break; + case 3: - lcd.FillRect(240-decalage,75,120,25);// A - lcd.FillRect(360-decalage,100,25,120);// E - lcd.FillRect(240-decalage,220,120,25);// G - lcd.FillRect(240-decalage,365,120,25);// D - lcd.FillRect(360-decalage,245,25,120);// F - break; - + lcd.FillRect(240-decalage,75,120,25);// A + lcd.FillRect(360-decalage,100,25,120);// E + lcd.FillRect(240-decalage,220,120,25);// G + lcd.FillRect(240-decalage,365,120,25);// D + lcd.FillRect(360-decalage,245,25,120);// F + break; + case 4: - lcd.FillRect(215-decalage,100,25,120);// B - lcd.FillRect(360-decalage,100,25,120);// E - lcd.FillRect(360-decalage,245,25,120);// F - lcd.FillRect(240-decalage,220,120,25);// G - break; - + lcd.FillRect(215-decalage,100,25,120);// B + lcd.FillRect(360-decalage,100,25,120);// E + lcd.FillRect(360-decalage,245,25,120);// F + lcd.FillRect(240-decalage,220,120,25);// G + break; + case 5: - lcd.FillRect(240-decalage,75,120,25);// A - lcd.FillRect(215-decalage,100,25,120);// B - lcd.FillRect(240-decalage,220,120,25);// G - lcd.FillRect(240-decalage,365,120,25);// D - lcd.FillRect(360-decalage,245,25,120);// F - break; - + lcd.FillRect(240-decalage,75,120,25);// A + lcd.FillRect(215-decalage,100,25,120);// B + lcd.FillRect(240-decalage,220,120,25);// G + lcd.FillRect(240-decalage,365,120,25);// D + lcd.FillRect(360-decalage,245,25,120);// F + break; + case 6: - lcd.FillRect(240-decalage,75,120,25);// A - lcd.FillRect(215-decalage,100,25,120);// B - lcd.FillRect(215-decalage,245,25,120);// C - lcd.FillRect(240-decalage,365,120,25);// D - lcd.FillRect(360-decalage,245,25,120);// F - lcd.FillRect(240-decalage,220,120,25);// G - break; - + lcd.FillRect(240-decalage,75,120,25);// A + lcd.FillRect(215-decalage,100,25,120);// B + lcd.FillRect(215-decalage,245,25,120);// C + lcd.FillRect(240-decalage,365,120,25);// D + lcd.FillRect(360-decalage,245,25,120);// F + lcd.FillRect(240-decalage,220,120,25);// G + break; + case 7: - lcd.FillRect(240-decalage,75,120,25);// A - lcd.FillRect(360-decalage,100,25,120);// E - lcd.FillRect(360-decalage,245,25,120);// F - break; - + lcd.FillRect(240-decalage,75,120,25);// A + lcd.FillRect(360-decalage,100,25,120);// E + lcd.FillRect(360-decalage,245,25,120);// F + break; + case 8: - lcd.FillRect(240-decalage,75,120,25); // A - lcd.FillRect(215-decalage,100,25,120); - lcd.FillRect(215-decalage,245,25,120); - lcd.FillRect(360-decalage,245,25,120);//... - lcd.FillRect(360-decalage,100,25,120); - lcd.FillRect(240-decalage,365,120,25); - lcd.FillRect(240-decalage,220,120,25);// G - break; - + lcd.FillRect(240-decalage,75,120,25); // A + lcd.FillRect(215-decalage,100,25,120); + lcd.FillRect(215-decalage,245,25,120); + lcd.FillRect(360-decalage,245,25,120);//... + lcd.FillRect(360-decalage,100,25,120); + lcd.FillRect(240-decalage,365,120,25); + lcd.FillRect(240-decalage,220,120,25);// G + break; + case 9: - lcd.FillRect(240-decalage,75,120,25);// A - lcd.FillRect(215-decalage,100,25,120);// B - lcd.FillRect(240-decalage,365,120,25);// D - lcd.FillRect(360-decalage,100,25,120);// E - lcd.FillRect(360-decalage,245,25,120);// F - lcd.FillRect(240-decalage,220,120,25);// G - break; + lcd.FillRect(240-decalage,75,120,25);// A + lcd.FillRect(215-decalage,100,25,120);// B + lcd.FillRect(240-decalage,365,120,25);// D + lcd.FillRect(360-decalage,100,25,120);// E + lcd.FillRect(360-decalage,245,25,120);// F + lcd.FillRect(240-decalage,220,120,25);// G + break; } } @@ -2367,7 +2525,7 @@ lcd.FillRect(360-200,100,25,120); lcd.FillRect(240-200,365,120,25); lcd.FillRect(240-200,220,120,25);// G - + lcd.FillRect(240,75,120,25); // A lcd.FillRect(215,100,25,120); lcd.FillRect(215,245,25,120); @@ -2384,134 +2542,109 @@ unsigned short angleAvant = 0; unsigned short angleArriere = 0; unsigned short orientationArrondie = 0; - + unsigned short position_avant_gauche=0; unsigned short position_avant_droite=0; unsigned short position_arriere_gauche=0; unsigned short position_arriere_droite=0; - + if(theta_robot >= 450 && theta_robot <= 1350) - orientationArrondie = 90; + orientationArrondie = 90; else if(theta_robot <= -450 && theta_robot >= -1350) orientationArrondie = 270; else if(theta_robot <= 450 && theta_robot >= -450) orientationArrondie = 0; else if(theta_robot >= 1350 && theta_robot <= -1350) orientationArrondie = 180; - + // Calcul de position pour faire la vérification de cohérence - if(orientationArrondie == 90 || orientationArrondie == 270) - { + if(orientationArrondie == 90 || orientationArrondie == 270) { position_avant_gauche = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_gauche; position_avant_droite = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_droite; position_arriere_gauche = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?0:3000) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?1:-1)*telemetreDistance_arriere_gauche; position_arriere_droite = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?0:3000) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?1:-1)*telemetreDistance_arriere_droite; - - } - else if(orientationArrondie == 0 || orientationArrondie == 180) - { + + } else if(orientationArrondie == 0 || orientationArrondie == 180) { position_avant_gauche = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_gauche; position_avant_droite = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_droite; position_arriere_gauche = ((theta_robot < 900 && theta_robot > -900)?0:2000) + ((theta_robot < 900 && theta_robot > -900)?1:-1)*telemetreDistance_arriere_gauche; position_arriere_droite = ((theta_robot < 900 && theta_robot > -900)?0:2000) + ((theta_robot < 900 && theta_robot > -900)?1:-1)*telemetreDistance_arriere_droite; } - - - if(orientationArrondie == 90 || orientationArrondie == 270) // Si il est en axe Y - { - if(position_arriere_droite >= y_robot-instruction.arg1 && position_arriere_droite <= y_robot+instruction.arg1) // Et que les mesures sont cohérentes - { - if(position_arriere_gauche >= y_robot-instruction.arg1 && position_arriere_gauche <= y_robot+instruction.arg1) - { + + + if(orientationArrondie == 90 || orientationArrondie == 270) { // Si il est en axe Y + if(position_arriere_droite >= y_robot-instruction.arg1 && position_arriere_droite <= y_robot+instruction.arg1) { // Et que les mesures sont cohérentes + if(position_arriere_gauche >= y_robot-instruction.arg1 && position_arriere_gauche <= y_robot+instruction.arg1) { if(telemetreDistance_arriere_droite > telemetreDistance_arriere_gauche) - angleArriere =900+(1800 * atan2((double)(telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche) , (double)ESPACE_INTER_TELEMETRE ))/M_PI; - else + angleArriere =900+(1800 * atan2((double)(telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche), (double)ESPACE_INTER_TELEMETRE ))/M_PI; + else angleArriere =(1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_arriere_gauche-telemetreDistance_arriere_droite) ))/M_PI; - + nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += angleArriere; } } - } - else if(orientationArrondie == 0 || orientationArrondie == 180) // Si il est en axe X - { - if(position_arriere_droite >= x_robot-instruction.arg1 && position_arriere_droite <= x_robot+instruction.arg1) // Et que les mesures sont cohérentes - { - if(position_arriere_gauche >= x_robot-instruction.arg1 && position_arriere_gauche <= x_robot+instruction.arg1) - { + } else if(orientationArrondie == 0 || orientationArrondie == 180) { // Si il est en axe X + if(position_arriere_droite >= x_robot-instruction.arg1 && position_arriere_droite <= x_robot+instruction.arg1) { // Et que les mesures sont cohérentes + if(position_arriere_gauche >= x_robot-instruction.arg1 && position_arriere_gauche <= x_robot+instruction.arg1) { if(telemetreDistance_arriere_droite > telemetreDistance_arriere_gauche) - angleArriere =900+(1800 * atan2( (double) (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche) , (double) ESPACE_INTER_TELEMETRE ))/M_PI; - else + angleArriere =900+(1800 * atan2( (double) (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche), (double) ESPACE_INTER_TELEMETRE ))/M_PI; + else angleArriere =(1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_arriere_gauche-telemetreDistance_arriere_droite) ))/M_PI; - + nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += angleArriere; } } } - - if(orientationArrondie == 90 || orientationArrondie == 270) // Si il est en axe Y - { - if(position_avant_droite >= y_robot-instruction.arg1 && position_avant_droite <= y_robot+instruction.arg1) // Et que les mesures sont cohérentes - { - if(position_avant_gauche >= y_robot-instruction.arg1 && position_avant_gauche <= y_robot+instruction.arg1) - { + + if(orientationArrondie == 90 || orientationArrondie == 270) { // Si il est en axe Y + if(position_avant_droite >= y_robot-instruction.arg1 && position_avant_droite <= y_robot+instruction.arg1) { // Et que les mesures sont cohérentes + if(position_avant_gauche >= y_robot-instruction.arg1 && position_avant_gauche <= y_robot+instruction.arg1) { if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche) - angleAvant = (1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) ))/M_PI; - else - angleAvant = 900 + (1800 * atan2( (double)( telemetreDistance_avant_gauche-telemetreDistance_avant_droite) ,(double) ESPACE_INTER_TELEMETRE ))/M_PI; - + angleAvant = (1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) ))/M_PI; + else + angleAvant = 900 + (1800 * atan2( (double)( telemetreDistance_avant_gauche-telemetreDistance_avant_droite),(double) ESPACE_INTER_TELEMETRE ))/M_PI; + + nombresDeMesuresAuxTelemetresQuiSontCoherentes++; + moyennageTelemetre += angleAvant; + } + } + } else if(orientationArrondie == 0 || orientationArrondie == 180) { // Si il est en axe X + if(position_avant_droite >= x_robot-instruction.arg1 && position_avant_droite <= x_robot+instruction.arg1) { // Et que les mesures sont cohérentes + if(position_avant_gauche >= x_robot-instruction.arg1 && position_avant_gauche <= x_robot+instruction.arg1) { + if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche) + angleAvant = (1800 * atan2((double) ESPACE_INTER_TELEMETRE, (double) (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) ))/M_PI; + else + angleAvant = 900 + (1800 * atan2( (double) (telemetreDistance_avant_gauche-telemetreDistance_avant_droite),(double) ESPACE_INTER_TELEMETRE ))/M_PI; + nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += angleAvant; } } } - else if(orientationArrondie == 0 || orientationArrondie == 180) // Si il est en axe X - { - if(position_avant_droite >= x_robot-instruction.arg1 && position_avant_droite <= x_robot+instruction.arg1) // Et que les mesures sont cohérentes - { - if(position_avant_gauche >= x_robot-instruction.arg1 && position_avant_gauche <= x_robot+instruction.arg1) - { - if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche) - angleAvant = (1800 * atan2((double) ESPACE_INTER_TELEMETRE, (double) (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) ))/M_PI; - else - angleAvant = 900 + (1800 * atan2( (double) (telemetreDistance_avant_gauche-telemetreDistance_avant_droite) ,(double) ESPACE_INTER_TELEMETRE ))/M_PI; - - nombresDeMesuresAuxTelemetresQuiSontCoherentes++; - moyennageTelemetre += angleAvant; - } - } - } - + angleRecalage = moyennageTelemetre/nombresDeMesuresAuxTelemetresQuiSontCoherentes; - - - - if(nombresDeMesuresAuxTelemetresQuiSontCoherentes) - { - if(orientationArrondie == 0) - { + + + + if(nombresDeMesuresAuxTelemetresQuiSontCoherentes) { + if(orientationArrondie == 0) { angleRecalage -= 900; - + /*if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche) - distanceRecalage = *); - else - distanceRecalage = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;*/ - } - else if(orientationArrondie == 90) - { - angleRecalage += 0; - } - else if(orientationArrondie == 180) - { - angleRecalage += 900; - } - else if(orientationArrondie == 270) - { + distanceRecalage = *); + else + distanceRecalage = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;*/ + } else if(orientationArrondie == 90) { + angleRecalage += 0; + } else if(orientationArrondie == 180) { + angleRecalage += 900; + } else if(orientationArrondie == 270) { angleRecalage += 1800; } } - + return (nombresDeMesuresAuxTelemetresQuiSontCoherentes && (angleAvant-angleArriere<80 && angleAvant-angleArriere>-80)) ? angleRecalage : theta_robot; } @@ -2519,35 +2652,31 @@ { unsigned char nombresDeMesuresAuxTelemetresQuiSontCoherentes = 0; unsigned int moyennageTelemetre = 0; - + telemetreDistance_avant_gauche = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_gauche; telemetreDistance_avant_droite = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_droite; telemetreDistance_arriere_gauche = ((theta_robot < 900 && theta_robot > -900)?0:2000) + ((theta_robot < 900 && theta_robot > -900)?1:-1)*telemetreDistance_arriere_gauche; telemetreDistance_arriere_droite = ((theta_robot < 900 && theta_robot > -900)?0:2000) + ((theta_robot < 900 && theta_robot > -900)?1:-1)*telemetreDistance_arriere_droite; - - if(telemetreDistance_avant_gauche >= x_robot-instruction.arg1 && telemetreDistance_avant_gauche <= x_robot+instruction.arg1) - { + + if(telemetreDistance_avant_gauche >= x_robot-instruction.arg1 && telemetreDistance_avant_gauche <= x_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_avant_gauche; } - if(telemetreDistance_avant_droite >= x_robot-instruction.arg1 && telemetreDistance_avant_droite <= x_robot+instruction.arg1) - { + if(telemetreDistance_avant_droite >= x_robot-instruction.arg1 && telemetreDistance_avant_droite <= x_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_avant_droite; } - if(telemetreDistance_arriere_gauche >= x_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= x_robot+instruction.arg1) - { + if(telemetreDistance_arriere_gauche >= x_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= x_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_arriere_gauche; } - if(telemetreDistance_arriere_droite >= x_robot-instruction.arg1 && telemetreDistance_arriere_droite <= x_robot+instruction.arg1) - { + if(telemetreDistance_arriere_droite >= x_robot-instruction.arg1 && telemetreDistance_arriere_droite <= x_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_arriere_droite; } - + moyennageTelemetre /= nombresDeMesuresAuxTelemetresQuiSontCoherentes; - + return (nombresDeMesuresAuxTelemetresQuiSontCoherentes)? moyennageTelemetre : x_robot; //SetOdometrie(ODOMETRIE_SMALL_POSITION, moyennageTelemetre, y_robot, theta_robot); } @@ -2555,35 +2684,31 @@ { unsigned char nombresDeMesuresAuxTelemetresQuiSontCoherentes = 0; unsigned int moyennageTelemetre = 0; - + telemetreDistance_avant_gauche = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_gauche; telemetreDistance_avant_droite = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_droite; telemetreDistance_arriere_gauche = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?0:3000) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?1:-1)*telemetreDistance_arriere_gauche; telemetreDistance_arriere_droite = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?0:3000) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?1:-1)*telemetreDistance_arriere_droite; - - if(telemetreDistance_avant_gauche >= y_robot-instruction.arg1 && telemetreDistance_avant_gauche <= y_robot+instruction.arg1) - { + + if(telemetreDistance_avant_gauche >= y_robot-instruction.arg1 && telemetreDistance_avant_gauche <= y_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_avant_gauche; } - if(telemetreDistance_avant_droite >= y_robot-instruction.arg1 && telemetreDistance_avant_droite <= y_robot+instruction.arg1) - { + if(telemetreDistance_avant_droite >= y_robot-instruction.arg1 && telemetreDistance_avant_droite <= y_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_avant_droite; } - if(telemetreDistance_arriere_gauche >= y_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= y_robot+instruction.arg1) - { + if(telemetreDistance_arriere_gauche >= y_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= y_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_arriere_gauche; } - if(telemetreDistance_arriere_droite >= y_robot-instruction.arg1 && telemetreDistance_arriere_droite <= y_robot+instruction.arg1) - { + if(telemetreDistance_arriere_droite >= y_robot-instruction.arg1 && telemetreDistance_arriere_droite <= y_robot+instruction.arg1) { nombresDeMesuresAuxTelemetresQuiSontCoherentes++; moyennageTelemetre += telemetreDistance_arriere_droite; } - + moyennageTelemetre /= nombresDeMesuresAuxTelemetresQuiSontCoherentes; - - return (nombresDeMesuresAuxTelemetresQuiSontCoherentes)? moyennageTelemetre : y_robot ; // SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, moyennageTelemetre, theta_robot); + + return (nombresDeMesuresAuxTelemetresQuiSontCoherentes)? moyennageTelemetre : y_robot ; // SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, moyennageTelemetre, theta_robot); }