![](/media/cache/profiles/4b0986230d9d7aded7f0c24033d221d4.jpg.50x50_q85.jpg)
Programme de contrôle de l'octopode 4DOF, Theraphosa-Salconi.
CtrlBridge
- fonction quelquonque pour communiquer avec les module
- fonction quelquonque pour faire des recherche dans les module dispo
- autre fonction pour jouer avec MemRegistre
Version 1.2.0
- Ajout d'un mode de simulation pour tester le code avec seulement un contrôleur stm32
Diff: directive.cpp
- Revision:
- 40:ecef15b1dfad
- Parent:
- 39:34d7802e8d15
--- a/directive.cpp Thu Oct 15 00:49:37 2015 +0000 +++ b/directive.cpp Tue Jan 31 13:08:55 2017 +0000 @@ -15,6 +15,7 @@ Directive::Directive():TTask(0)//on veux que cette tache sois exec toute les fois que TTaskGen sexecute. { + /* initialize random seed: */ srand (time(NULL)); myMaze = new Labyrinthe(); @@ -26,7 +27,7 @@ m_valueCapteurUltrasonic = 0; m_valueCapteurIR = 0; m_valueCapteurProximiter = 0; - for(int i =0; i<10; i++)tableauDeCommange[i]= 0; + for(int i =0; i < DIRECTIVE_TABLEAUDECOMMANDE_SIZE; i++)tableauDeCommange[i]= 0; size_tableauDeCommange=0; debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r set explorer \n\r"); myMaze->setMyPos(Labyrinthe::explorer); @@ -168,9 +169,10 @@ while(idCommand != 9) { - debug("\x1B[;H"); //cursor default position + debug("\n\r press any key"); idCommand = fgetc(pc) - '0'; + debug("\x1B[;H"); //cursor default position debug("\x1B[2J"); //clear screen updateModuleValue(); @@ -198,7 +200,7 @@ } else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) <= DIRECTIVE_ULTRASONIC_LIMIT_SHORT) { //plus proche que 1 case - debug("\n\r -Objet proche %g <= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_SHORT); + debug("\n\r -Objet proche %g <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_SHORT); areaLatt =0; @@ -229,7 +231,7 @@ } else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) <= DIRECTIVE_ULTRASONIC_LIMIT_MIDDLE) { //plus proche que 2 case - debug("\n\r -Objet proche %g <= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_MIDDLE); + debug("\n\r -Objet proche %g <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_MIDDLE); //modifier vue que il ne detecte pas asser loin /* /-M-\ @@ -243,7 +245,7 @@ } else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) <= DIRECTIVE_ULTRASONIC_LIMIT_LONG) { //plus proche que 2 case - debug("\n\r -Objet proche %g <= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); + debug("\n\r -Objet proche %g <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); //modifier vue que il ne detecte pas asser loin /* /-M-\ @@ -257,7 +259,7 @@ } else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) > DIRECTIVE_ULTRASONIC_LIMIT_LONG) { //plus proche que 2 case - debug("\n\r -Objet proche %g >= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); + debug("\n\r -Objet proche %g >= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); //modifier vue que il ne detecte pas asser loin /* /?V?\ @@ -422,6 +424,7 @@ debug(DEBUG_DIRECTIVE_TEST,": %i",IRToCm(ADCTomv(m_valueCapteurIR)));*/ } #endif + } Directive::~Directive() { @@ -435,12 +438,62 @@ } void Directive::task(void)//ALL CODE HERE// { + #ifdef DEBUG_DIRECTIVE_MINIMAL_PRESENTATION + if(pc.readable()) + { + int idCommand=0; + idCommand = fgetc(pc) - '0'; + string mymap; + switch(idCommand) + { + case 1: + debug("\n\r 1: Show Map "); + + mymap = myMaze->showMap(); + debug("\n\r Labyrinthe map: X:%02i Y:%02i \n\r",(signed char)(myMaze->getX()),(signed char)(myMaze->getY())); + //char caseCaract = 0; + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); + debug("\n\r"); + break; + + case 2: + debug("\n\r *2: Show tableauDeCommange[]"); + debug("\n\r -TAB:"); + for(int i =0; i<DIRECTIVE_TABLEAUDECOMMANDE_SIZE; i++) debug("[%02x]",tableauDeCommange[i]); + if(followThePath == true) + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r EN MODE FOLLOW THE PATH"); + else + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r HORS MODE FOLLOW THE PATH"); + break; + + case 3: + debug("\n\r *3: Show value Capteurs"); + debug("\n\r -IRToCm(%02f): %02f",ADCTomv(m_valueCapteurIR),IRToCm(ADCTomv(m_valueCapteurIR))); + debug("\n\r -ultrasonicToInch to cm: %02f",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic))); + debug("\n\r -m_valueCapteurProximiter: %02d",m_valueCapteurProximiter); + break; + + default: + debug("\n\n\r Press key 0-9 to select an option"); + debug("\n\r *1: Show Map"); + debug("\n\r *2: Show tableauDeCommange[]"); + debug("\n\r *3: Show value Capteurs"); + break; + } + } + #endif #ifdef DEBUG_BOOT_GRAPHICAL_INTERFACE debug("\x1B[2J"); //clear screen debug("\x1B[25l");//hide cursor debug("\x1B[;H"); //cursor default position debug("\n\r--------In task directive--------"); + for(int i = 0; i<size_tableauDeCommange; i++) debug("\n\r tableauDeCommange[%i]: %x",i,tableauDeCommange[i]); /* createDLbox(0,0,10,25,"BrainControle"); @@ -499,10 +552,11 @@ #ifndef DEBUG_DIRECTIVE_LEG_DISABLE if(ctrDesPattes->isSeqComplet()) { + //////////////// // Inspection // //////////////// - updateModuleValue(); + //updateModuleValue(); if((tableauDeCommange[0] == TBL_CMD_MARCHE) && (size_tableauDeCommange == 1)) { @@ -542,9 +596,11 @@ ////////////////////////////// // Traitement du Labyrinthe // ////////////////////////////// - debug(DEBUG_DIRECTIVE_TRAITEMENT,"\n\r -IRToCm(%02f): %02f",ADCTomv(m_valueCapteurIR),IRToCm(ADCTomv(m_valueCapteurIR))); - debug(DEBUG_DIRECTIVE_TRAITEMENT,"\n\r -ultrasonicToInch: %02f",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic))); - debug(DEBUG_DIRECTIVE_TRAITEMENT,"\n\r -m_valueCapteurProximiter: %02d",m_valueCapteurProximiter); + #ifdef DEBUG_DIRECTIVE_LABYRINTH + debug("\n\r -IRToCm(%02f): %02f",ADCTomv(m_valueCapteurIR),IRToCm(ADCTomv(m_valueCapteurIR))); + debug("\n\r -ultrasonicToInch: %02f",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic))); + debug("\n\r -m_valueCapteurProximiter: %02d",m_valueCapteurProximiter); + #endif #endif //DEBUG_DIRECTIVE_LEG_DISABLE if(followThePath == true) debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r EN MODE FOLLOW THE PATH"); @@ -570,7 +626,7 @@ nextCase = myMaze->getC(myMaze->getX()+1,myMaze->getY()); break; }*/ - if( myMaze->getC_Foward() == Labyrinthe::vide ) + if(( myMaze->getC_Foward() == Labyrinthe::vide ) || (myMaze->getC_Foward() == Labyrinthe::pasExplorer )) followThePath = false; @@ -602,10 +658,12 @@ { debug(DEBUG_DIRECTIVE_TEST,"\n\r jeverifie si alternative"); - #ifndef DEBUG_DIRECTIVE_LEG_DISABLE + /*#ifndef DEBUG_DIRECTIVE_LEG_DISABLE addTableauDeCommande(TBL_CMD_MARCHE); - #endif + #endif*/ nextCase = checkOtherWay(myMaze->getDirection(),1); + + turnRightDirection(myMaze->getDirection(),nextCase); debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\rnextcase: %i",nextCase); switch(nextCase) { // on verifie si on a une direction possible @@ -715,6 +773,7 @@ { // on suis un chemin debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\rmode follow the path\n\n\r"); positionXY tempPosition; + //std::list<positionXY>::iterator it=bufferNewWay.begin(); for (std::list<positionXY>::iterator it=bufferNewWay.begin(); it != bufferNewWay.end(); ++it) { @@ -730,6 +789,8 @@ debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r current dir : %i",myMaze->getDirection()); debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r next dir : %i",(bufferNewWay.front()).direction); + addTableauDeCommande(TBL_CMD_RECULE); + addTableauDeCommande(TBL_CMD_RECULE); turnRightDirection(myMaze->getDirection(),(bufferNewWay.front()).direction); switch((bufferNewWay.front()).direction) { @@ -780,6 +841,17 @@ debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r buffer Y: %i",(bufferNewWay.front()).posY); if((tempPosition.posX == (bufferNewWay.front()).posX) && (tempPosition.posY == (bufferNewWay.front()).posY)) { + updateMaze(); + + nextCase = myMaze->getC_Foward(); + + if(nextCase == Labyrinthe::mur) + { + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r problem"); + followThePath = false; + } + else + { debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r aucun problem"); #ifndef DEBUG_DIRECTIVE_LEG_DISABLE addTableauDeCommande(TBL_CMD_MARCHE); @@ -787,7 +859,7 @@ myMaze->moveFoward(); myMaze->setMyPos(Labyrinthe::explorer); bufferNewWay.pop_front(); - + } } else debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r problem"); @@ -798,6 +870,13 @@ if(bufferNewWay.empty()) followThePath = false; + + + + + + + /*do{ //tempPosition.posX = (bufferNewWay.front()).posX; //tempPosition.posY = (bufferNewWay.front()).posY; @@ -868,7 +947,10 @@ //addTableauDeCommande(6); }*/ - + #ifdef DEBUG_DIRECTIVE_TASK_PAUSE + debug("\n\r press any 9 key"); + for(int idCmd=0; idCmd != 9; idCmd = fgetc(pc) - '0'); + #endif /////////////// // Mouvement // /////////////// @@ -943,9 +1025,9 @@ break; } debug(DEBUG_DIRECTIVE_TEST,"\n\r -TAB:"); - for(int i =0; i<10; i++) debug(DEBUG_DIRECTIVE_TEST,"[%02x]",tableauDeCommange[i]); - for(int i =0; i<9; i++)tableauDeCommange[i]= tableauDeCommange[i+1]; - tableauDeCommange[9]=0; + for(int i =0; i<DIRECTIVE_TABLEAUDECOMMANDE_SIZE; i++) debug(DEBUG_DIRECTIVE_TEST,"[%02x]",tableauDeCommange[i]); + for(int i =0; i<DIRECTIVE_TABLEAUDECOMMANDE_SIZE; i++) tableauDeCommange[i]= tableauDeCommange[i+1]; + tableauDeCommange[DIRECTIVE_TABLEAUDECOMMANDE_SIZE-1] = 0; if(size_tableauDeCommange != 0) size_tableauDeCommange--; } @@ -991,7 +1073,7 @@ } void Directive::addTableauDeCommande(unsigned char value) { - if(size_tableauDeCommange!=10) + if(size_tableauDeCommange!=DIRECTIVE_TABLEAUDECOMMANDE_SIZE) { tableauDeCommange[size_tableauDeCommange]=value; size_tableauDeCommange++; @@ -1021,11 +1103,22 @@ else tempValue = data[0]; - m_valueCapteurUltrasonic = m_valueCapteurUltrasonic+((tempValue -m_valueCapteurUltrasonic)/DIRECTIVE_ULTRASONIC_BUFFER_LENGHT); + if(data.size() != 0) + m_valueCapteurUltrasonic = m_valueCapteurUltrasonic+((tempValue -m_valueCapteurUltrasonic)/DIRECTIVE_ULTRASONIC_BUFFER_LENGHT); } #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE + debug("\n\r m_valueCapteurUltrasonic"); debug("\n\n\r data size:%i \n\r",data.size()); - debug("\n\r -data(value):%i ",data[0]); + switch(data.size()) + { + case 1: + debug("\n\r -data(value):%i ",data[0]); + break; + case 2: + debug("\n\r -data(value):%i ",(data[0]<<8) + data[1]); + break; + } + //debug("\n\r -data(value):%i ",data[0]); debug("\n\r -tempValue(value):%02f ",tempValue); #endif tempValue=0; @@ -1048,11 +1141,22 @@ else tempValue = data[0]; - m_valueCapteurIR=m_valueCapteurIR+((tempValue-m_valueCapteurIR)/DIRECTIVE_IR_BUFFER_LENGHT); + if(data.size() != 0) + m_valueCapteurIR=m_valueCapteurIR+((tempValue-m_valueCapteurIR)/DIRECTIVE_IR_BUFFER_LENGHT); } #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE + debug("\n\r m_valueCapteurIR"); debug("\n\n\r data size:%i \n\r",data.size()); - debug("\n\r -data(value):%i ",data[0]); + switch(data.size()) + { + case 1: + debug("\n\r -data(value):%i ",data[0]); + break; + case 2: + debug("\n\r -data(value):%i ",(data[0]<<8) + data[1]); + break; + } + //debug("\n\r -data(value):%i ",data[0]); debug("\n\r -tempValue(value):%02f ",tempValue); #endif //debug("\n\n\r data size:%i \n\r",data.size()); @@ -1064,6 +1168,7 @@ flag.append(1,7); //debug("\n\n\r flag size:%i \n\r",flag.size()); if(m_CtrlBridge->send(m_capteurProximiter[0],flag,data)) + m_valueCapteurProximiter = data[0]; // debug("\n\n\r data size:%i \n\r",data.size()); @@ -1072,34 +1177,43 @@ void Directive::analiseMaze(void) { - char areaLatt =0; - char areaVert =0; - string mymap = myMaze->showMap(); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r Labyrinthe map: X:%02i Y:%02i \n\r",(signed char)(myMaze->getX()),(signed char)(myMaze->getY())); - - debug(DEBUG_DIRECTIVE_LABYRINTH,"Direction: "); + string mymap = myMaze->showMap(); + + #ifdef DEBUG_DIRECTIVE_LABYRINTH + debug("\n\r ----------------analiseMaze--------------\n\r"); + debug("\n\r Labyrinthe map: X:%02i Y:%02i \n\r",(signed char)(myMaze->getX()),(signed char)(myMaze->getY())); + + debug("Direction: "); switch(myMaze->getDirection()) { case UP: - debug(DEBUG_DIRECTIVE_LABYRINTH,"Up \n\r"); + debug("Up \n\r"); break; case DOWN: - debug(DEBUG_DIRECTIVE_LABYRINTH,"Down \n\r"); + debug("Down \n\r"); break; case LEFT: - debug(DEBUG_DIRECTIVE_LABYRINTH,"Left \n\r"); + debug("Left \n\r"); break; case RIGHT: - debug(DEBUG_DIRECTIVE_LABYRINTH,"Right \n\r"); + debug("Right \n\r"); break; } - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); + debug("\n\r"); + #endif + + + + + + + #ifndef DEBUG_DIRECTIVE_LABYRINTH_USER_CTRL @@ -1133,16 +1247,173 @@ areaVert =1; } debug(DEBUG_DIRECTIVE_TEST,": %i",IRToCm(ADCTomv(m_valueCapteurIR)));*///old one - if((inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic))<= 1) /*&& (IRToCm(ADCTomv(m_valueCapteurIR)) <= 80)*/)//enlever parce que il est lock avec des limites + + updateMaze(); + + #ifdef DEBUG_DIRECTIVE_LABYRINTH + mymap = myMaze->showMap(); + //char caseCaract = 0; + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); + debug("\n\r"); + + debug("\n\r-------------------\n\r"); + #endif + +} + +char Directive::checkOtherWay(char dir, bool checkExplorer) +{ + char result = 0; + char order[3]; + + + + bool fini = false; + + switch(rand() % 6) + { + case 0://[0],[1],[2] + order[0] = 0; + order[1] = 1; + order[2] = 2; + break; + case 1://[0],[2],[1] + order[0] = 0; + order[1] = 2; + order[2] = 1; + break; + case 2://[1],[0],[2] + order[0] = 1; + order[1] = 0; + order[2] = 2; + break; + case 3://[2],[0],[1] + order[0] = 2; + order[1] = 0; + order[2] = 1; + break; + case 4://[1],[2],[0] + order[0] = 1; + order[1] = 2; + order[2] = 0; + break; + case 5://[2],[1],[0] + order[0] = 2; + order[1] = 1; + order[2] = 0; + break; + } + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\rresult: "); + for(int i=0; (i<3)&&(!fini); i++) + { + switch(order[i]) + { // inclure un état memoir affin que si il a le choix entre une case vide et une explorer il priorise la vide// pt faire de meme avec pas explorer + case 0: + result = myMaze->getC_ToLeft(); + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r getC_ToLeft: %i %i ****",result,myMaze->getC_ToLeft()); + //if(((Labyrinthe::case_t)result != Labyrinthe::error)&&((Labyrinthe::case_t)result != Labyrinthe::mur) &&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1) ) + if(((Labyrinthe::case_t)result == Labyrinthe::vide)&&((Labyrinthe::case_t)result != Labyrinthe::mur) &&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1) ) + { + fini = true; + result = LEFT; + } + break; + case 1: + result = myMaze->getC_Backward(); + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r getC_Backward: %i %i ****",result,myMaze->getC_Backward()); + if(/*((Labyrinthe::case_t)result != Labyrinthe::error)&&*/((Labyrinthe::case_t)result != Labyrinthe::mur)&&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1)) + { + fini = true; + result = DOWN; + } + break; + case 2: + result = myMaze->getC_ToRight(); + debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r getC_ToRight: %i %i ****",result,myMaze->getC_ToRight()); + if(/*((Labyrinthe::case_t)result != Labyrinthe::error)&&*/((Labyrinthe::case_t)result != Labyrinthe::mur)&&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1)) + { + fini = true; + result = RIGHT; + } + break; + } + } + + if(fini) + { + switch(dir) + { + /*case UP: + break;*/ + case DOWN: + switch(result) + { + case LEFT: + result = RIGHT; + break; + case DOWN: + result = UP; + break; + case RIGHT: + result = LEFT; + break; + } + break; + case LEFT: + switch(result) + { + case LEFT: + result = DOWN; + break; + case DOWN: + result = RIGHT; + break; + case RIGHT: + result = UP; + break; + } + break; + case RIGHT: + switch(result) + { + case LEFT: + result = UP; + break; + case DOWN: + result = LEFT; + break; + case RIGHT: + result = DOWN; + break; + } + break; + } + } + else + result =0; + return result; +} + +void Directive::updateMaze(void) +{ + char areaLatt =0; + char areaVert =0; + + if((inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic))<= 1) /*&& (IRToCm(ADCTomv(m_valueCapteurIR)) <= 80)*/)//enlever parce que il est lock avec des limites { //capteur ultrasson embrouiller/imprecis debug(DEBUG_DIRECTIVE_TEST,"\n\r -Capteur Ultrasson brouiller"); //addTableauDeCommande(6); } - else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) <= DIRECTIVE_ULTRASONIC_LIMIT_SHORT) + else if((inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic))) <= DIRECTIVE_ULTRASONIC_LIMIT_SHORT) { //plus proche que 1 case #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE - debug("\n\r -Objet proche %g <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_SHORT); + debug("\n\r -Objet proche %02f <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_SHORT); #endif areaLatt =0; @@ -1172,7 +1443,7 @@ else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) <= DIRECTIVE_ULTRASONIC_LIMIT_MIDDLE) { //plus proche que 2 case #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE - debug("\n\r -Objet proche %g <= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_MIDDLE); + debug("\n\r -Objet proche %g <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_MIDDLE); #endif //modifier vue que il ne detecte pas asser loin /* @@ -1188,7 +1459,7 @@ else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) <= DIRECTIVE_ULTRASONIC_LIMIT_LONG) { //plus proche que 2 case #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE - debug("\n\r -Objet proche %g <= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); + debug("\n\r -Objet proche %g <= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); #endif //modifier vue que il ne detecte pas asser loin /* @@ -1204,7 +1475,7 @@ else if(inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)) > DIRECTIVE_ULTRASONIC_LIMIT_LONG) { //plus proche que 2 case #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE - debug("\n\r -Objet proche %g >= %g cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); + debug("\n\r -Objet proche %g >= %i cm",inchToCm(ultrasonicToInch(m_valueCapteurUltrasonic)),DIRECTIVE_ULTRASONIC_LIMIT_LONG); #endif //modifier vue que il ne detecte pas asser loin /* @@ -1290,6 +1561,9 @@ */ //vertical==0 latt==0 //mur devant //vertical==1 latt==1 + #ifdef DEBUG_DIRECTIVE_UPDATE_MODULE + debug("\n\r vertical:%i \n\r latt: %i",areaVert,areaLatt); + #endif //////////////////////////////////// //345 //012 | numerotation des case @@ -1447,153 +1721,6 @@ } //////////////////////////////////// - - - #ifdef DEBUG_DIRECTIVE_LABYRINTH_USER_CTRL - mymap = myMaze->showMap(); - //char caseCaract = 0; - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - - debug("\n\r-------------------\n\r"); - #endif -} - -char Directive::checkOtherWay(char dir, bool checkExplorer) -{ - char result = 0; - char order[3]; - - - - bool fini = false; - - switch(rand() % 6) - { - case 0://[0],[1],[2] - order[0] = 0; - order[1] = 1; - order[2] = 2; - break; - case 1://[0],[2],[1] - order[0] = 0; - order[1] = 2; - order[2] = 1; - break; - case 2://[1],[0],[2] - order[0] = 1; - order[1] = 0; - order[2] = 2; - break; - case 3://[2],[0],[1] - order[0] = 2; - order[1] = 0; - order[2] = 1; - break; - case 4://[1],[2],[0] - order[0] = 1; - order[1] = 2; - order[2] = 0; - break; - case 5://[2],[1],[0] - order[0] = 2; - order[1] = 1; - order[2] = 0; - break; - } - debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\rresult: "); - for(int i=0; (i<3)&&(!fini); i++) - { - switch(order[i]) - { // inclure un état memoir affin que si il a le choix entre une case vide et une explorer il priorise la vide// pt faire de meme avec pas explorer - case 0: - result = myMaze->getC_ToLeft(); - debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r getC_ToLeft: %i %i ****",result,myMaze->getC_ToLeft()); - //if(((Labyrinthe::case_t)result != Labyrinthe::error)&&((Labyrinthe::case_t)result != Labyrinthe::mur) &&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1) ) - if(((Labyrinthe::case_t)result == Labyrinthe::vide)&&((Labyrinthe::case_t)result != Labyrinthe::mur) &&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1) ) - { - fini = true; - result = LEFT; - } - break; - case 1: - result = myMaze->getC_Backward(); - debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r getC_Backward: %i %i ****",result,myMaze->getC_Backward()); - if(/*((Labyrinthe::case_t)result != Labyrinthe::error)&&*/((Labyrinthe::case_t)result != Labyrinthe::mur)&&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1)) - { - fini = true; - result = DOWN; - } - break; - case 2: - result = myMaze->getC_ToRight(); - debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r getC_ToRight: %i %i ****",result,myMaze->getC_ToRight()); - if(/*((Labyrinthe::case_t)result != Labyrinthe::error)&&*/((Labyrinthe::case_t)result != Labyrinthe::mur)&&((checkExplorer)?((Labyrinthe::case_t)result != Labyrinthe::explorer):1)) - { - fini = true; - result = RIGHT; - } - break; - } - } - - if(fini) - { - switch(dir) - { - /*case UP: - break;*/ - case DOWN: - switch(result) - { - case LEFT: - result = RIGHT; - break; - case DOWN: - result = UP; - break; - case RIGHT: - result = LEFT; - break; - } - break; - case LEFT: - switch(result) - { - case LEFT: - result = DOWN; - break; - case DOWN: - result = RIGHT; - break; - case RIGHT: - result = UP; - break; - } - break; - case RIGHT: - switch(result) - { - case LEFT: - result = UP; - break; - case DOWN: - result = LEFT; - break; - case RIGHT: - result = DOWN; - break; - } - break; - } - } - else - result =0; - return result; } void Directive::checkOtherWay(char &caseFront, char &caseBack, char &caseLeft, char &caseRight) { @@ -2018,25 +2145,31 @@ debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r pop back"); bufferNewWay.pop_back();//on enleve pour pouvoir lire le dernier } + #ifdef DEBUG_DIRECTIVE_LABYRINTH string mymap = myMaze->showMap(); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r Labyrinthe map: X:%02i Y:%02i \n\r",(signed char)(myMaze->getX()),(signed char)(myMaze->getY())); + debug("\n\r Labyrinthe map: X:%02i Y:%02i \n\r",(signed char)(myMaze->getX()),(signed char)(myMaze->getY())); //char caseCaract = 0; debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r direction: %i",myMaze->getDirection()); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r"); - for(int i=0; i<3; i++) debug(DEBUG_DIRECTIVE_LABYRINTH," [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+6])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i+3])); + debug("\n\r"); + for(int i=0; i<3; i++) debug(" [%c] ",myMaze->caseToChar((Labyrinthe::case_t)mymap[i])); + #endif + + #ifdef DEBUG_DIRECTIVE_TASK_PAUSE debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r press any key...\n\r"); fgetc(pc); - + #endif } while((wrongWay) && (!noOtherWay)); debug(DEBUG_DIRECTIVE_MAZE_GRAPHICAL_INTERFACE_ENABLE,"\n\r Fin Boucle"); } - debug(DEBUG_DIRECTIVE_LABYRINTH,"\n\r press any key...\n\r"); fgetc(pc); + #ifdef DEBUG_DIRECTIVE_TASK_PAUSE + debug("\n\r press any key...\n\r"); fgetc(pc); + #endif } myMaze->setX(backupPosX); @@ -2080,13 +2213,15 @@ { if(rand()%2) { - addTableauDeCommande(TBL_CMD_TURN_LEFT); - addTableauDeCommande(TBL_CMD_TURN_LEFT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_LEFT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_LEFT); + //addTableauDeCommande(TBL_CMD_TURN_LEFT); } else { - addTableauDeCommande(TBL_CMD_TURN_RIGHT); - addTableauDeCommande(TBL_CMD_TURN_RIGHT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_RIGHT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_RIGHT); + //addTableauDeCommande(TBL_CMD_TURN_RIGHT); } } else @@ -2096,41 +2231,41 @@ case UP: if(nextDir == LEFT) { - addTableauDeCommande(TBL_CMD_TURN_LEFT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_LEFT); } else if(nextDir == RIGHT) { - addTableauDeCommande(TBL_CMD_TURN_RIGHT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_RIGHT); } break; case DOWN: if(nextDir == LEFT) { - addTableauDeCommande(TBL_CMD_TURN_RIGHT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_RIGHT); } else if(nextDir == LEFT) { - addTableauDeCommande(TBL_CMD_TURN_LEFT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_LEFT); } break; case LEFT: if(nextDir == UP) { - addTableauDeCommande(TBL_CMD_TURN_RIGHT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_RIGHT); } else if(nextDir == DOWN) { - addTableauDeCommande(TBL_CMD_TURN_LEFT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_LEFT); } break; case RIGHT: if(nextDir == UP) { - addTableauDeCommande(TBL_CMD_TURN_LEFT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_LEFT); } else if(nextDir == DOWN) { - addTableauDeCommande(TBL_CMD_TURN_RIGHT); + for(int loop=0; loop < DIRECTIVE_NUMBER_TURN_90_DEG; loop++) addTableauDeCommande(TBL_CMD_TURN_RIGHT); } break; }