Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
- Committer:
- AlexisCollin
- Date:
- 2019-06-07
- Revision:
- 32:84bcb8f2667a
- Parent:
- 31:85d9fb71f921
- Child:
- 33:c70ded6dd380
File content as of revision 32:84bcb8f2667a:
#include "mbed.h" #include "CAN_asser.h" #include "Robot.h" #include "math.h" bool automate_aveugle(Robot&, bool&); //automate de début de partie void automate_ejecte(Robot&, bool&); // void automate_testLasers(Robot&); // void automate_testABalle(Robot&, bool&); // void automate_deplacement(Robot&); // void automate_vitesse(Robot&); //automate pour la vitesse du robot bool automate_fin_de_partie(Robot&); //automate crève ballon de fin de partie bool automate_arretUrgence(Robot&); //automate d'arrêt d'urgence au filet void automate_run(Robot&); //automate principale de partie typedef enum{TURN_FAST, CORRECT_GAUCHE, CORRECT_DROITE, GO_STRAIGHT} type_etat_deplacement; type_etat_deplacement etat_deplacement = TURN_FAST; int main(void) { Robot robot; while(1) { automate_run(robot); // Trois balles en début de partie à l'aveugle /*if( !automate_aveugle(robot, ejecte) ); else if(automate_fin_de_partie(robot)) { robot.stopRouleau(); break; } automate_ejecte(robot, ejecte);*/ // Gestion du lancer de balle /*automate_testABalle(robot, ejecte); automate_ejecte(robot, ejecte); // Recherche de balles automate_testLasers(robot); if(!robot.aBalle()) automate_deplacement(robot); // Gestion de la vitesse en fonction de l'état actuel automate_vitesse(robot);*/ } } void automate_run(Robot& robot) { bool ejecte = false; typedef enum{ATTENTE,RUN} type_etat; static type_etat etat = ATTENTE; static Timer T_partie; switch(etat) { case ATTENTE: if(!Robot::Jack) { T_partie.start(); etat = RUN; } break; case RUN: if(T_partie.read() < 35.0f) { /*while( !*/automate_aveugle(robot, ejecte)/* )*/; automate_ejecte(robot, ejecte); } else { T_partie.stop(); robot.stopRouleau(); automate_fin_de_partie(robot); } break; } } bool automate_fin_de_partie(Robot& robot) { typedef enum{AVANCE, EXPLOSE_BALLON, FIN_PARTIE} type_etat; static type_etat etat = AVANCE; static Timer T_fin; switch(etat) { case AVANCE: robot.avance(); if(automate_arretUrgence(robot)) etat = EXPLOSE_BALLON; break; case EXPLOSE_BALLON: robot.stop(); if(robot.leveBras()) { robot.exploseBallon(); T_fin.start(); etat = FIN_PARTIE; } break; case FIN_PARTIE: if(T_fin.read() >= 2.0f && robot.baisseBras()) { robot.arreteDisquette(); return true; } } return false; } bool automate_arretUrgence(Robot& robot) { typedef enum{RAS, PERCEPTION, ARRET_URGENCE, ATTENTE_REPLACEMENT} type_etat; static type_etat etat = RAS; // Timer pour la durée sur la ligne blanche static Timer timerCNY; switch(etat) { case RAS : if( robot.surBlanc( Robot::CNY_GAUCHE ) && robot.surBlanc( Robot::CNY_DROIT )){ etat = PERCEPTION; timerCNY.start(); } break; case PERCEPTION : if( robot.surBlanc( Robot::CNY_GAUCHE ) && robot.surBlanc( Robot::CNY_DROIT ) && timerCNY.read() >= 0.15f ) etat = ARRET_URGENCE; else if( timerCNY.read() >= 0.15f ){ etat = RAS; timerCNY.stop(); timerCNY.reset(); } break; case ARRET_URGENCE : timerCNY.stop(); timerCNY.reset(); etat = ATTENTE_REPLACEMENT; return true; case ATTENTE_REPLACEMENT : if( !robot.surBlanc( Robot:: CNY_GAUCHE ) && !robot.surBlanc( Robot::CNY_DROIT )) etat = RAS; break; } return false; } bool automate_aveugle(Robot& robot, bool& ejecte) { typedef enum{STRAIGHT1, PREMIER_TOURNE_D, TOURNE_D, STRAIGHT2, TOURNE_G} type_etat; static type_etat etat = STRAIGHT1; static Timer T_ejecte; static int cptBalles = 0; if(cptBalles == 2) return true; switch(etat) { case STRAIGHT1: if(robot.avance(1850 - DIST_CENTRE)) { ejecte = true; etat = PREMIER_TOURNE_D; } break; case PREMIER_TOURNE_D: if(robot.tourne(ANGLE_DROIT)) etat = STRAIGHT2; break; case TOURNE_D: if(robot.tourne(ANGLE_DROIT)) etat = STRAIGHT2; break; case STRAIGHT2: if(robot.avance(1500)) etat = TOURNE_G; break; case TOURNE_G: if(robot.tourne(-ANGLE_DROIT)) { ejecte = true; cptBalles++; etat = TOURNE_D; } break; } return false; } void automate_ejecte(Robot& robot, bool& ejecte) { typedef enum{GOBE, EJECTE, ATTENTE} type_etat; static type_etat etat = GOBE; static Timer timer_ejecte; switch(etat) { case GOBE: robot.gobe(); if(ejecte) etat = EJECTE; break; case EJECTE: robot.ejecte(); timer_ejecte.start(); etat = ATTENTE; break; case ATTENTE: if( timer_ejecte >= 1.0f ){ timer_ejecte.stop(); timer_ejecte.reset(); ejecte = false; etat = GOBE; } break; } } void automate_testLasers(Robot& robot) { static const int diffMurBalle = 20; static float past_gauche, past_droit, actual_gauche, actual_droit; static float distBalle; actual_gauche = robot.getDist(Laser::Gauche); actual_droit = robot.getDist(Laser::Droit); switch(etat_deplacement) { case TURN_FAST: if(actual_droit < past_droit - diffMurBalle) { distBalle = actual_droit; robot.stop(); etat_deplacement = CORRECT_GAUCHE; } break; case CORRECT_GAUCHE: break; case CORRECT_DROITE: break; case GO_STRAIGHT: break; } past_gauche = actual_gauche; past_droit = actual_droit; } void automate_testABalle(Robot& robot, bool& ejecte) { typedef enum {ATTENTE,ABALLE} type_etat; static type_etat etat = ATTENTE; switch(etat) { case ATTENTE: if(robot.aBalle()) { robot.stop(); etat = ABALLE; robot.setSpeed(80,500); //vitesse de rotation vers le terrain ennemi } break; case ABALLE: if( robot.tourne( -robot.pos(Robot::THETA) ) ) { ejecte = true; etat = ATTENTE; etat_deplacement = TURN_FAST; } break; } } void automate_deplacement(Robot& robot) { switch(etat_deplacement) { case TURN_FAST: robot.tourne(); break; case CORRECT_GAUCHE: robot.tourne(-450); break; case CORRECT_DROITE: robot.tourne(450); case GO_STRAIGHT: robot.avance(); break; } } void automate_vitesse(Robot& robot) { switch(etat_deplacement) { case TURN_FAST: robot.setSpeed(80,450); break; case CORRECT_GAUCHE: robot.setSpeed(50,300); break; case CORRECT_DROITE: robot.setSpeed(50,300); break; case GO_STRAIGHT: robot.setSpeed(80,400); break; } }