コード例 #1
0
ファイル: Salon.cpp プロジェクト: Aredhele/FreakyMonsters
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());
	}
}
コード例 #2
0
/**
 * @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;
}