#include "DriverJeuLaser.h" #include "GestionSon.h" #include "Affichage_Valise.h" #define BASE_TIMEOUT 100 #define NB_JOUEUR 4 #define SEUIL 0x3c1f1*3 /* on augmente le seuil pour eviter que le score des autres joueurs augmente lorsqu'un joueur touche la cible. Après test, cette valeur permet de n'avoir aucun faux positifs et aucun faux negatifs */ extern int DFT_ModuleAuCarre(short int * LeSignal, int k); extern short int LeSignal[]; // structure représentant un joueur struct joueur { int k; // le "k" associé à sa DFT int score; // son score int timeout; // utilisé pour ne pas compter plusieur fois la même salve int dft; }; struct joueur tabJoueur[6]; // correspond à quelle valeur de k pour notre joueur i int valK [6] = {17,18,19,20,23,24}; int tab[64]; short int dma_buf[64]; int nLed = 0; int nCible = 1; void majCible() { Prepare_Clear_LED(nLed); nLed++; nCible++; if (nCible > 4) { nCible = 1; } if (nLed > 3) { nLed = 0; } Prepare_Set_LED(nLed); Choix_Capteur(nCible); } void fTick(){ // Démarrage de la DMA Start_DMA1(64); // Attente de la fin de DMA Wait_On_End_Of_DMA1(); // Arrêter la DMA Stop_DMA1; for (int k=0; k < NB_JOUEUR; k++){ // on calcule la DFT uniquement si le joueur n'est pas en timeout if (tabJoueur[k].timeout == 0){ tabJoueur[k].dft = DFT_ModuleAuCarre((short *) &dma_buf[0], tabJoueur[k].k); // si la DFT est au dessus d'un certain seuil on augmente le score et on lance le timeout if (tabJoueur[k].dft >= SEUIL){ tabJoueur[k].score ++; tabJoueur[k].timeout = BASE_TIMEOUT; // Lance le son StartSon(); // Gestion de l'affichage Prepare_Afficheur(k+1, tabJoueur[k].score); majCible(); } } else { // si le joueur est en timeout on décrémente sa valeur de timeout tabJoueur[k].timeout--; } } Mise_A_Jour_Afficheurs_LED(); } int main(void) { // =========================================================================== // ============= INIT PERIPH (faites qu'une seule fois) ===================== // =========================================================================== // Gestion aaffichage Init_Affichage(); //inititialisation des structures for(int i = 0; i < 6; i++){ tabJoueur[i].score = 0; tabJoueur[i].timeout = 0; tabJoueur[i].dft = 0; tabJoueur[i].k = valK[i]; } // Après exécution : le coeur CPU est clocké à 72MHz ainsi que tous les timers CLOCK_Configure(); Systick_Period_ff( 360000 ); // 5ms pour une clock a 72 MhHz Systick_Prio_IT(9, fTick); // Gestion de la DMA Init_TimingADC_ActiveADC_ff( ADC1, 72 ); Single_Channel_ADC( ADC1, 2 ); Init_Conversion_On_Trig_Timer_ff( ADC1, TIM2_CC2, 225 ); Init_ADC1_DMA1( 0, dma_buf ); // Gestion des sons GPIO_Configure(GPIOB, 0, OUTPUT, ALT_PPULL); Timer_1234_Init_ff(TIM4,6552); Active_IT_Debordement_Timer(TIM4, 2,CallbackSon); PWM_Init_ff(TIM3, 3, 720); SysTick_On; SysTick_Enable_IT; Choix_Capteur(1); Prepare_Set_LED(0); while (1) { } }