void Salon::gestionRequete(unsigned char octetsRecus[], Joueur * joueur) { std::size_t nombreOctetsEnvoye = 0; if (octetsRecus[0] == REQUETE_MONSTRE_SELECTIONNE) { joueur->monstreSuivant(); ReponseMonstreSelectionne reponse; reponse.ajouterIdMonstre(joueur->getIdMonstre()); gestionErreur(reponse.envoyerRequete( joueur->getSocketTcp(), NOMBRE_RENVOI_MAX), REQUETE_MONSTRE_SELECTIONNE, TAILLE_REPONSE_MONSTRE_SELECTIONNE); } else if (octetsRecus[0] == REQUETE_ETAT_SALON) { ReponseEtatSalon reponse(getNombreJoueur()); for (unsigned int i = 0; i < NOMBRE_JOUEUR_MAX; i++) { if (listeJoueur[i] != NULL) { reponse.ajouterJoueur(listeJoueur[i]->getDataEnTete()); } if (listeJoueur[i] == joueur) { reponse.ajouterIndiceClient(i); } } if (joueur == hote) { reponse.estHote(true); } gestionErreur(reponse.envoyerRequete( joueur->getSocketTcp(), NOMBRE_RENVOI_MAX), REQUETE_ETAT_SALON, TAILLE_ENTETE_JOUEUR*getNombreJoueur()+2); } else if (octetsRecus[0] == REQUETE_EQUIPE_SUIVANTE) { // client : idrequete / idEquipe joueur->equipeSuivante(); ReponseEquipeSelectionnee reponse; reponse.ajouterIdEquipe(joueur->getEquipe()); gestionErreur(reponse.envoyerRequete( joueur->getSocketTcp(), NOMBRE_RENVOI_MAX), REQUETE_EQUIPE_SUIVANTE, TAILLE_REPONSE_EQUIPE_SELECTIONNEE); } else if (octetsRecus[0] == REQUETE_LANCER_PARTIE) { // client : idRequete // renvoi : idrequete / erreur -> a tous les clients ReponseLancerPartie reponse; if (joueur != hote) { std::cout << "erreur hote " << std::endl; reponse.ajouterFlagErreur(true); afficheur->afficher("sa " + std::to_string(numeroSalon), "trch", "Joueur[" + std::to_string(joueur->getNumeroJoueur()) + "] : " + " a tenté de lancer la partie sans être hôte - " + listeJoueur[joueur->getNumeroJoueur()]->getSocketTcp()->getRemoteAddress().toString()); gestionErreur(reponse.envoyerRequete(joueur->getSocketTcp(), NOMBRE_RENVOI_MAX), REQUETE_LANCER_PARTIE, TAILLE_REPONSE_LANCER_PARTIE); } else { for (unsigned int i = 0; i < NOMBRE_JOUEUR_MAX; i++) { if (listeJoueur[i] != NULL) { gestionErreur(reponse.envoyerRequete(listeJoueur[i]->getSocketTcp(), NOMBRE_RENVOI_MAX), REQUETE_LANCER_PARTIE, TAILLE_REPONSE_LANCER_PARTIE); } } lancerPartie(); return; } } else if (octetsRecus[0] == REQUETE_QUITTER_SALON) { ReponseQuitterSalon reponse; gestionErreur(reponse.envoyerRequete(joueur->getSocketTcp(), NOMBRE_RENVOI_MAX), REQUETE_QUITTER_SALON, TAILLE_REPONSE_QUITTER_SALON); liberationSocket(joueur->getNumeroJoueur()); } }
/** * @fn int main(void) * @brief Fonction main du programme. */ int main(void) { // Déclaration des variables locales. match oldMatchStatus = OVER; // Etat précédent duu match (pour les actions d'entrée) actionType choix; //<! Pointeur vers l'action en cours. positionInteger positionInitiale; //<! Position initiale du robot sur la table team equipe; //<! Equipe actuelle. // propIsObstacleType test; pllConfig(); // Configuration de la PLL de l'horloge interne pour tourner à 40MIPS assignSPIO(); // Assignation des pins du dSPIC. servoInit(4, TIMER_2, 10); // initialise 1 servo, utilisant le timer2 à 10ms timerSetup(TIMER_5, 50); TMR5 = 0; initAX12(); // Init de l'AX12 // Initialisation du CAN CanInitialisation(CN_LOGIQUE); propulsionInitCan(); CanDeclarationProduction(CN_LOGIQUE*0x10, &matchStatus, sizeof(matchStatus)); CanDeclarationProduction(CN_LOGIQUE*0x10, &mesureSharp, sizeof(mesureSharp)); ACTIVATE_CAN_INTERRUPTS = 1; //msTimerInit(); // Initialisation du timer des millisecondes, n'est utilisé que pour waitXms (TODO: enlever en mêm temps que waitXms) while(1) { if (getMatchTimerFlag()) { matchStatus = OVER; } // Machine d'état de la logique switch (matchStatus) { case INIT: // Etat initial, phase précédant le match if (matchStatus != oldMatchStatus) { oldMatchStatus = matchStatus; CanEnvoiProduction(&matchStatus); matchTimerInit(); // Initialisation du timer de match initServoClap(); initADC(); // RentrerAimant(); initBLE(); if (EnvoiSharpActif == 1){ timerStart(TIMER_5); IEC1bits.T5IE = 1; } } if (!GOUPILLE_OTEE) { matchStatus = PRE_MATCH; } break; case PRE_MATCH: // Le robot attend le début du match. On peut encore choisir la couleur /* if (detectionObstacleSharp().isObstacleDetected && cool){ // FermerPince(); } else{ // OuvrirPince(); }*/ if (radioGetRxBufferSpace() > 0){ radioGetChar(); } if (matchStatus != oldMatchStatus) { oldMatchStatus = matchStatus; CanEnvoiProduction(&matchStatus); } if (BOUTON_EQUIPE == JAUNE) { equipe = JAUNE; positionInitiale = positionInitialeJaune; //ordreActions = actionsJaune; nbActions = NB_ACTIONS_JAUNE; } else { equipe = VERT; positionInitiale = positionInitialeVert; //ordreActions = actionsVert; nbActions = NB_ACTIONS_VERT; } // TRANSITIONS if (GOUPILLE_OTEE) { // si la goupille est retirée, le match commence StartMatchTimer(); // on lance le timer de match (90s)) propulsionEnable(); // on active la propulsion // msTimerStart(); while(propulsionGetStatus() != STANDING); // on attend que l'ordre soit exécuté propulsionSetPosition(positionInitiale); // On initialise la position de la propulsion while(!compareXYAlpha(propulsionGetPosition(), positionInitiale)); // on attend que l'ordre soit exécuté choix = choixAction(); // Sélection de la prochaine action => c'est dans cette fonction qu'il faut mettre de l'IA matchStatus = ONGOING; } break; case ONGOING: // Le match est lancé if (matchStatus != oldMatchStatus) { oldMatchStatus = matchStatus; CanEnvoiProduction(&matchStatus); } infoAction = choix.ptr2Fct(choix.dest,choix.methode); if (canReceivedOrderFlag) { canReceivedOrderFlag = 0; if (canReceivedCommand == LOGI_SHARP_MESURE) { EnvoiSharpActif = canReceivedData[0]; } } // On met à jour la position de l'autre robot //propulsionAddObstacle(getAllyPos()); switch(infoAction.statut) { case ACTION_PAS_COMMENCEE: case ACTION_EN_COURS: // on attend la fin de l'action break; case ACTION_FINIE: case ACTION_REMISE: choix = choixAction(); // Sélection de la prochaine action => c'est dans cette fonction qu'il faut mettre de l'IA break; case ACTION_ERREUR: matchStatus = ERROR; default: break; } break; case OVER: if (matchStatus != oldMatchStatus) { oldMatchStatus = matchStatus; CanEnvoiProduction(&matchStatus); propulsionDisable(); } if (!GOUPILLE_OTEE) { matchStatus = INIT; } break; case ERROR: if (matchStatus != oldMatchStatus) { oldMatchStatus = matchStatus; CanEnvoiProduction(&matchStatus); } choix = gestionErreur(choix); matchStatus = ONGOING; break; default: matchStatus = ERROR; break; } } return 0; }