strat des robots

Fork of CRAC-Strat_2017 by CRAC Team

Revision:
1:116040d14164
Parent:
0:ad97421fb1fb
Child:
2:8d8e2cf798a3
--- a/Strategie/Strategie.cpp	Wed Apr 13 22:04:54 2016 +0000
+++ b/Strategie/Strategie.cpp	Fri Apr 15 10:49:40 2016 +0000
@@ -21,6 +21,8 @@
 unsigned char checkCurrent = 0;
 unsigned char countAliveCard = 0; 
 
+unsigned char InversStrat = 0;//Si à 1, indique que l'on part de l'autre cote de la table(inversion des Y)
+
 
 void chronometre_ISR (void)
 {
@@ -28,20 +30,23 @@
     SendRawId(GLOBAL_GAME_END);//Indication fin de match
     gameTimer.stop();//Arret du timer
 
-#if ROBOT_TYPE == ROBOT_BIG
+#ifdef ROBOT_BIG
     doFunnyAction();
 #endif
     
-    gameEtat = ETAT_END_LOOP;
+    while(1);//On bloque la programme dans l'interruption
 }
 
 void automate_process(void)
 {
     static struct S_Instruction instruction;
+    static unsigned char AX12_enchainement = 0;
+    static unsigned char MV_enchainement = 0;
     signed char localData1 = 0;
     signed short localData2 = 0;
     unsigned short localData3 = 0;
     signed short localData4 = 0;
+    unsigned char localData5 = 0;
     
     if(gameTimer.read_ms() >= 88000) {//Fin du match (On autorise 2s pour déposer des éléments
         gameTimer.stop();
@@ -160,25 +165,22 @@
             Il est aussi possible d'envoyer les ordres de debug
             */
         break;
-        case ETAT_GAME_START:
+        case ETAT_GAME_INIT:
             //On charge la liste des instructions
             strcpy(cheminFileStart,"/local/test.txt");//On ouvre le fichier test.txt
             loadAllInstruction();//Mise en cache de toute les instructions
-            fakeJack.reset();//Utiliser pour simuler le jack
-            fakeJack.start();//Utiliser pour simuler le jack
             gameEtat = ETAT_GAME_WAIT_FOR_JACK;
             SendRawId(ECRAN_ACK_START_MATCH);
             tactile_printf("Attente du JACK.");
         break;
         case ETAT_GAME_WAIT_FOR_JACK:
             //TODO Attendre le jack
-            if(fakeJack.read_ms() > 3000) {//Utiliser pour simuler le jack
-                fakeJack.stop();
-                gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
-                gameTimer.reset();
-                gameTimer.start();
-                chronoEnd.attach(&chronometre_ISR,90);
-            }
+        break;
+        case ETAT_GAME_START:
+            gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+            gameTimer.reset();
+            gameTimer.start();
+            chronoEnd.attach(&chronometre_ISR,90);
         break;
         case ETAT_GAME_LOAD_NEXT_INSTRUCTION:
             /*
@@ -195,6 +197,7 @@
                 //actual_instruction++;
             }
             screenChecktry = 0;
+            wait_ms(100);
         break;
         case ETAT_GAME_PROCESS_INSTRUCTION:
             /*
@@ -213,9 +216,18 @@
                     waitingAckID = ASSERVISSEMENT_RECALAGE;
                     waitingAckFrom = ACKNOWLEDGE_MOTEUR;
                     if(instruction.nextActionType == ENCHAINEMENT) {
-                        //TODO - flag dans le trame pour indiquer l'enchainement  
-                        
+                        MV_enchainement++;
+                        localData5 = 1;
+                    } else {
+                        if(MV_enchainement > 0) {
+                            localData5 = 2;
+                            MV_enchainement = 0;
+                        } else {
+                            localData5 = 0;
+                        }
                     }
+                    localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1);
+                    GoStraight(localData2, 0, 0, localData5);
                 break;
                 case MV_TURN:
                     if(instruction.direction == RELATIVE) {
@@ -251,12 +263,11 @@
                         //L'action est spécifique
                     } else {
                         //C'est un AX12 qu'il faut bouger
+                        AX12_setGoal(instruction.arg1,instruction.arg3,instruction.arg2);
+                        AX12_enchainement++;
                     }
-                
-                    //TODO - mettre l'ACK à jour
-                    if(instruction.nextActionType == ENCHAINEMENT) {
-                        //TODO - flag dans le trame pour indiquer l'enchainement    
-                    }
+                    waitingAckFrom = 0;
+                    waitingAckID = 0;
                 break;
                 default:
                     //Instruction inconnue, on l'ignore
@@ -270,6 +281,10 @@
                 screenChecktry++;//On incrèment le conteur de tentative de 1
                 cartesCheker.reset();//On reset le timeOut
                 cartesCheker.start();
+                if(AX12_enchainement > 0) {
+                    AX12_processChange();//Il faut lancer le déplacement des AX12
+                    AX12_enchainement = 0;
+                }
             } else {//C'est un enchainement
                 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
@@ -318,7 +333,8 @@
                             waitingAckFrom = INSTRUCTION_END_MOTEUR;
                         break;
                         case ACTION:
-                            //TODO 
+                            waitingAckFrom = SERVO_AX12_DONE;
+                            waitingAckID = instruction.arg1;
                         break;
                         default:
                         break;
@@ -385,6 +401,13 @@
             case ASSERVISSEMENT_STOP:
                 
             break;
+            
+            case DEBUG_FAKE_JAKE:
+                if(gameEtat == ETAT_GAME_WAIT_FOR_JACK) {
+                    gameEtat = ETAT_GAME_START;
+                }
+            break;
+            
             case ALIVE_BALISE:
             case ALIVE_MOTEUR:
             case ALIVE_IHM:
@@ -405,7 +428,7 @@
                     waitingAckID = 0;
                 }
             break;
-#if ROBOT_TYPE == ROBOT_BIG
+#ifdef ROBOT_BIG
             case ODOMETRIE_BIG_POSITION:
 #else
             case ODOMETRIE_SMALL_POSITION:
@@ -417,7 +440,7 @@
             
             case ECRAN_START_MATCH:
                 if(gameEtat == ETAT_CONFIG) {
-                    gameEtat = ETAT_GAME_START;
+                    gameEtat = ETAT_GAME_INIT;
                 }
             break;
             case SERVO_AX12_SETGOAL:
@@ -428,6 +451,9 @@
             case SERVO_AX12_PROCESS:
                 AX12_processChange();
             break;
+            case SERVO_AX12_DONE:
+                AX12_notifyCANEnd(((unsigned short)(msgRxBuffer[FIFO_lecture].data[0])));
+            break;
         }        
         
         FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;