carte_strategie_2019

Dependencies:   mbed SerialHalfDuplex SDFileSystem DISCO-F469NI_portrait liaison_Bluetooth ident_crac

Revision:
14:c8fc06c4887f
Parent:
12:14729d584500
Child:
15:c2fc239e85df
--- a/Strategie/Strategie.cpp	Tue Jan 31 16:00:33 2017 +0000
+++ b/Strategie/Strategie.cpp	Fri Mar 31 16:20:26 2017 +0000
@@ -1,4 +1,4 @@
-#include "Strategie.h"
+ #include "Strategie.h"
 
 E_stratGameEtat     gameEtat  = ETAT_CHECK_CARTE_SCREEN;
 E_stratGameEtat     lastEtat  = ETAT_CHECK_CARTE_SCREEN;
@@ -13,6 +13,7 @@
 
 unsigned short waitingAckID = 0;//L'id du ack attendu
 unsigned short waitingAckFrom = 0;//La provenance du ack attendu
+char modeTelemetre; // Si à 1, indique que l'on attend une reponse du telemetre 
 
 signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
 
@@ -21,8 +22,12 @@
 signed short start_move_x,start_move_y,start_move_theta;//La position du robot lors du début d'un mouvement, utilisé pour reprendre le mouvement apres stop balise
 
 #ifdef ROBOT_BIG
-unsigned short id_check[NOMBRE_CARTES]= {CHECK_BALISE,CHECK_MOTEUR,CHECK_ACTIONNEURS,CHECK_AX12,CHECK_POMPES};
-unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_BALISE,ALIVE_MOTEUR,ALIVE_ACTIONNEURS,ALIVE_AX12,ALIVE_POMPES};
+//unsigned short id_check[NOMBRE_CARTES]= {CHECK_BALISE,CHECK_MOTEUR,CHECK_ACTIONNEURS,CHECK_AX12,CHECK_POMPES};
+//unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_BALISE,ALIVE_MOTEUR,ALIVE_ACTIONNEURS,ALIVE_AX12,ALIVE_POMPES};
+
+unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR};
+unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR};
+
 InterruptIn jack(p25); //  entrée analogique en interruption pour le jack
 #else
 unsigned short id_check[NOMBRE_CARTES]= {CHECK_BALISE,CHECK_MOTEUR,CHECK_ACTIONNEURS};
@@ -34,10 +39,13 @@
 
 unsigned char InversStrat = 1;//Si à 1, indique que l'on part de l'autre cote de la table(inversion des Y)
 
+unsigned char ModeDemo = 0; // Si à 1, indique que l'on est dans le mode demo
+
 unsigned char countRobotNear = 0;//Le nombre de robot à proximité
 
 unsigned char ingnorBaliseOnce = 0;
 
+
 /****************************************************************************************/
 /* FUNCTION NAME: chronometre_ISR                                                       */
 /* DESCRIPTION  : Interruption à la fin des 90s du match                                */
@@ -80,7 +88,7 @@
     signed char localData1 = 0;
     signed short localData2 = 0;
     unsigned short localData3 = 0;
-    signed short localData4 = 0;
+    //signed short localData4 = 0;
     unsigned char localData5 = 0;
     
     if(gameTimer.read_ms() >= 89000) {//Fin du match (On autorise 2s pour déposer des éléments
@@ -109,6 +117,8 @@
             cartesCheker.start();//On lance le timer pour le timeout
             gameEtat = ETAT_CHECK_CARTE_SCREEN_WAIT_ACK;
             
+            //gameEtat = ETAT_GAME_START;
+            
         break;
         case ETAT_CHECK_CARTE_SCREEN_WAIT_ACK:
             /*
@@ -142,6 +152,10 @@
             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:
             /*
@@ -203,10 +217,12 @@
             Il est possible de modifier la couleur et l'id de la stratégie
             Il est aussi possible d'envoyer les ordres de debug
             */
+            modeTelemetre = 0;
         break;
         case ETAT_GAME_INIT:
             //On charge la liste des instructions
             loadAllInstruction();//Mise en cache de toute les instructions
+            
             gameEtat = ETAT_GAME_WAIT_FOR_JACK;
             SendRawId(ECRAN_ACK_START_MATCH);
             tactile_printf("Attente du JACK.");
@@ -230,10 +246,13 @@
             //On attend le jack
         break;
         case ETAT_GAME_START:
-            chronoEnd.attach(&chronometre_ISR,90);//On lance le chrono de 90s
             gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+            
+            if (ModeDemo == 0){
+                chronoEnd.attach(&chronometre_ISR,90);//On lance le chrono de 90s
+                gameTimer.start();
+            } 
             gameTimer.reset();
-            gameTimer.start();
             jack.fall(NULL);//On désactive l'interruption du jack
             SendRawId(GLOBAL_START);
             tactile_printf("Start");//Pas vraiment util mais bon
@@ -243,6 +262,7 @@
             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
@@ -297,6 +317,7 @@
                     }
                     localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1);
                     GoStraight(localData2, 0, 0, localData5);
+                    
                 break;
                 case MV_TURN: //Rotation sur place
                     if(instruction.direction == RELATIVE) {
@@ -358,11 +379,13 @@
                     GoStraight(localData2, localData5, localData3, 0);
                 break;
                 case ACTION:
+                    SendRawId(0x300);
                     waitingAckFrom = 0;
                     waitingAckID = 0;
                     if(doAction(instruction.arg1,instruction.arg2,instruction.arg3)) {
                         //L'action est spécifique
                         if((waitingAckFrom == 0 && waitingAckID == 0) || instruction.nextActionType == ENCHAINEMENT) {
+                            ///wait_us(200);
                             actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
                             gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
                         } else {
@@ -373,6 +396,7 @@
                         //C'est un AX12 qu'il faut bouger
                         AX12_setGoal(instruction.arg1,instruction.arg3/10,instruction.arg2);
                         AX12_enchainement++;
+                                                
                     }
                 break;
                 default:
@@ -401,7 +425,7 @@
             /*
             Attente de l'ack de l'instruction
             */
-            if(waitingAckID == 0 && waitingAckFrom ==0) {//Les ack ont été reset, c'est bon on continu
+            if(waitingAckID == 0 && waitingAckFrom == 0) {//Les ack ont été reset, c'est bon on continu
             //if(true) {
                 cartesCheker.stop();
                 if(instruction.nextActionType == JUMP) {
@@ -437,8 +461,16 @@
                             waitingAckFrom = INSTRUCTION_END_MOTEUR;
                         break;
                         case ACTION:
-                            waitingAckFrom = 0;//SERVO_AX12_DONE;
-                            waitingAckID = 0;//instruction.arg1;
+                            SendRawId(0x302);
+                            waitingAckFrom = 0; //SERVO_AX12_DONE;
+                            waitingAckID = 0;// instruction.arg1;
+                            /*if (modeTelemetre == 0){
+                                
+                            }else{ // si on attend la reponse du telemetre
+                                waitingAckFrom = 0;//TELEMETRE_RECHERCHE_OBJET;
+                                waitingAckID = OBJET_SUR_TABLE;   
+                                //modeTelemetre = 0;  
+                            }*/
                         break;
                         default:
                         break;
@@ -505,9 +537,13 @@
         
         
         
-        case ETAT_END:
-           
-            gameEtat = ETAT_END_LOOP;
+        case ETAT_END: 
+            if (ModeDemo){
+                gameEtat = ETAT_CHECK_CARTE_SCREEN;
+                ModeDemo = 1;
+            } else {
+                gameEtat = ETAT_END_LOOP;
+            }
         break;
         case ETAT_END_LOOP:
             //Rien, on tourne en rond
@@ -555,6 +591,7 @@
             case ACKNOWLEDGE_BALISE:
             case ACKNOWLEDGE_MOTEUR:
             case ACKNOWLEDGE_IHM:
+            case ACKNOWLEDGE_TELEMETRE:
             case INSTRUCTION_END_BALISE:
             case INSTRUCTION_END_MOTEUR:
             case INSTRUCTION_END_IHM:
@@ -580,17 +617,25 @@
             break;
             case SERVO_AX12_SETGOAL:
                 //SendAck(0x114, SERVO_AX12_SETGOAL);
-                if(AX12_isLocal(msgRxBuffer[FIFO_lecture].data[0]))
-                    AX12_setGoal(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[2])<<8), msgRxBuffer[FIFO_lecture].data[3]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[4])<<8));
+                //if(AX12_isLocal(msgRxBuffer[FIFO_lecture].data[0]))
+                    //AX12_setGoal(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[2])<<8), msgRxBuffer[FIFO_lecture].data[3]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[4])<<8));
                   
             break;
+            
             case SERVO_AX12_PROCESS:
-                //SendAck(0x114, SERVO_AX12_PROCESS);
-                AX12_processChange(1);
+                SendAck(0x114, SERVO_AX12_PROCESS);
+                //AX12_processChange(1);
             break;
+            
             case SERVO_AX12_DONE:
-                //SendAck(0x114, SERVO_AX12_DONE);
+                SendRawId(0x666);
+                /*//SendAck(0x114, SERVO_AX12_DONE);
                 AX12_notifyCANEnd(((unsigned short)(msgRxBuffer[FIFO_lecture].data[0])));
+                
+                /*gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                waitingAckFrom = 0;
+                waitingAckID = 0;*/
+                
             break;
             case ECRAN_CHOICE_COLOR://Choix de la couleur
                 if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config
@@ -609,6 +654,11 @@
                     
                 }
             break;
+                
+            case TELEMETRE_RECHERCHE_COIN:
+                SendRawId(RESET_TELEMETRE);
+            break;
+            
             case ECRAN_CHOICE_STRAT://Choix du fichier de stratégie à utiliser
                 if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config
                     msgTx.id=ECRAN_ACK_STRAT; // tx ack de la couleur
@@ -617,6 +667,14 @@
                     msgTx.type=CANData;
                     if(SelectStrategy(msgRxBuffer[FIFO_lecture].data[0])) {
                         // id de la stratégie sur 1 octet
+                        if (msgRxBuffer[FIFO_lecture].data[0] < 0x10){
+                                // Si la strat est une strat de match, on desactive le mode demo
+                                ModeDemo = 0;
+                        } else {
+                                // sinon, on active le mode demo, utile pour la fin de la demo
+                                ModeDemo = 1;
+                        }
+                        
                         msgTx.data[0]=msgRxBuffer[FIFO_lecture].data[0];
                     } else {
                         //erreur sur 1 octet
@@ -664,6 +722,13 @@
                     SendRawId(ECRAN_ACK_CHOICE_START_ACTION);
                 }
             break;
+            
+            case OBJET_SUR_TABLE:
+                if ((gameEtat == ETAT_GAME_WAIT_ACK)&&(modeTelemetre)){
+                    strat_instructions[actual_instruction+1].arg1 = msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8);
+                    strat_instructions[actual_instruction+1].arg2 = msgRxBuffer[FIFO_lecture].data[2]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[3])<<8);
+                }
+            break;
         }        
         
         FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;