// This is invoked each time there is a change in the button state (result of a push or a bounce). // move tank. Creat new tank bullet void pb_interrupt_handler() { // Clear the GPIO interrupt. XGpio_InterruptGlobalDisable(&gpPB); // Turn off all PB interrupts for now. XGpio_InterruptClear(&gpPB, 0xFFFFFFFF); // Ack the PB interrupt. XGpio_InterruptGlobalEnable(&gpPB); // Re-enable PB interrupts. }
// This is invoked each time there is a change in the button state (result of a push or a bounce). void pb_interrupt_handler() { // Clear the GPIO interrupt. XGpio_InterruptGlobalDisable(&gpPB); // Turn off all PB interrupts for now. currentButtonState = XGpio_DiscreteRead(&gpPB, 1); // Get the current state of the buttons. // You need to do something here. XGpio_InterruptClear(&gpPB, 0xFFFFFFFF); // Ack the PB interrupt. XGpio_InterruptGlobalEnable(&gpPB); // Re-enable PB interrupts. // Because there is a change in the button state, the button counters need to be reinitialized. debounce_timer_count = 0; }
// This is invoked each time there is a change in the button state (result of a push or a bounce). void pb_interrupt_handler() { // Clear the GPIO interrupt. XGpio_InterruptGlobalDisable(&gpPB); // Turn off all PB interrupts for now. currentButtonState = XGpio_DiscreteRead(&gpPB, 1); // Get the current state of the buttons. // Reset button counter btnCounter = 0; XGpio_InterruptClear(&gpPB, 0xFFFFFFFF); // Ack the PB interrupt. XGpio_InterruptGlobalEnable(&gpPB); // Re-enable PB interrupts. }
// This is invoked each time there is a change in the button state (result of a push or a bounce). void pb_interrupt_handler() { // Clear the GPIO interrupt. // Turn off all PB interrupts for now. XGpio_InterruptGlobalDisable(&gpPB); // Get the current state of the buttons. u32 currentButtonState = XGpio_DiscreteRead(&gpPB, 1); bouncing = bouncer(currentButtonState); // Ack the PB interrupt. XGpio_InterruptClear(&gpPB, 0xFFFFFFFF); // Re-enable PB interrupts. XGpio_InterruptGlobalEnable(&gpPB); }
// This is invoked each time there is a change in the button state (result of a push or a bounce). void pb_interrupt_handler() { // Clear the GPIO interrupt. XGpio_InterruptGlobalDisable(&gpPB); // Turn off all PB interrupts for now. int currentButtonState = XGpio_DiscreteRead(&gpPB, 1); // Get the current state of the buttons. static int previousButtonState; if (previousButtonState != currentButtonState) { debounceTimer = 0; debounceTimerEnable = true; previousButtonState = currentButtonState; } // You need to do something here. XGpio_InterruptClear(&gpPB, 0xFFFFFFFF); // Ack the PB interrupt. XGpio_InterruptGlobalEnable(&gpPB); // Re-enable PB interrupts. }
void interrupt_handler_dispatcher(void* ptr) { // Ask the Interrupt Controller for a status of its interrupts uint32_t status = XIntc_GetIntrStatus(XPAR_INTC_0_BASEADDR); // Check what triggered the interrupt if (status & XPAR_FIT_TIMER_0_INTERRUPT_MASK) { // Let the timer know it got an interrupt! // if (interrupts_timer_handler) interrupts_timer_handler(); // Then acknowledge it so it can interrupt again XIntc_AckIntr(XPAR_INTC_0_BASEADDR, XPAR_FIT_TIMER_0_INTERRUPT_MASK); } else if (status & XPAR_PUSH_BUTTONS_5BITS_IP2INTC_IRPT_MASK) { // ---------- // Turn off all PB interrupts for now. XGpio_InterruptGlobalDisable(&gpPB); u32 currentButtonState = XGpio_DiscreteRead(&gpPB, 1); pb_interrupt_handler(currentButtonState); // XAC97_PlayAudio(XPAR_AXI_AC97_0_BASEADDR, sound_alienMove2.data, &sound_alienMove2.data[sound_alienMove2.numSamples]); // Ack the PB interrupt. XGpio_InterruptClear(&gpPB, 0xFFFFFFFF); // Re-enable PB interrupts. XGpio_InterruptGlobalEnable(&gpPB); // ------ XIntc_AckIntr(XPAR_INTC_0_BASEADDR, XPAR_PUSH_BUTTONS_5BITS_IP2INTC_IRPT_MASK); } else if (status & XPAR_AXI_AC97_0_INTERRUPT_MASK) { fifo_interrupt_handler(); XIntc_AckIntr(XPAR_INTC_0_BASEADDR, XPAR_AXI_AC97_0_INTERRUPT_MASK); } }
//update bullets, move aliens, move motherhsip, make new alien bullet if less than 4 on screen void timer_interrupt_handler(){ //xil_printf("Interrupt Handler\n\r"); //xil_printf("firstSound: %d\n\r",firstSound); if(globals_tankDeath == running){ if(readyForSound){ samples = explosionSamples; num_samples = explosionNumSamples; readyForSound = false; } XGpio_InterruptGlobalDisable(&gpPB); // Turn off all PB interrupts for now. if(first){ timer = 1; first = false; } //perform tank animation----------------------------------------------------------------------- if(timer < EXPLODE_TIME){//explode for two seconds if(!(timer % 2)) write_tank_explosion1(); else write_tank_explosion2(); } else{ //explosionSoundIndex = 0; first = true; timer = 1; globals_tankDeath = stopped; write_tank_black(); globals_setTankPosition(INITIAL_TANK_POSITION); write_tank_to_memory(); XGpio_InterruptGlobalEnable(&gpPB); // Re-enable PB interrupts. } } //tank death animation isn't happening. Do other stuff else{ u32 currentButtonState = XGpio_DiscreteRead(&gpPB, 1); // Get the current state of the buttons. // allow user to use buttons, even multiple at once. All three at once don't move the tank but do shoot a bullet if(!(timer % TANK_SPEED)){ switch(currentButtonState){ case 8: moveTankLeft(); break; case 1: newTankBullet(); if(readyForSound){ samples = tankFireArray; num_samples = tankFireSamples; readyForSound = false; } break; case 2: moveTankRight(); break; case 9: moveTankLeft(); newTankBullet(); if(readyForSound){ samples = tankFireArray; num_samples = tankFireSamples; readyForSound = false; } break; case 3: moveTankRight(); newTankBullet(); if(readyForSound){ samples = tankFireArray; num_samples = tankFireSamples; readyForSound = false; } break; case 11: newTankBullet(); if(readyForSound){ samples = tankFireArray; num_samples = tankFireSamples; readyForSound = false; } break; case 4: //volume up break; case 16: //volume down break; default: break; } } //ensure random for mothership and alien bullets srand(timer); //if mothership is present, move mothership----------------------------------------------------- if(globals_mothershipState == ALIVE && !(timer % MOTHERSHIP_SPEED)){ //assign new position for mothership mothershipPosition += MOTHERSHIP_MOVEMENT; //mothership at the edge? if(mothershipPosition + MOTHERSHIP_WIDTH >= X_MAX-MOTHERSHIP_EDGE_CORRECTION){ mothershipSpawnCounter = rand() % (MOTHERSHIP_MAX + 1 - MOTHERSHIP_MIN) + MOTHERSHIP_MIN;//create a new spawn timer globals_mothershipState = DEAD; //erase mothership write_mothership_black_to_memory(); mothershipPosition = 0; //reset mothership position } else write_mothership_to_memory(); //if not at edge, move the ship on screen if(readyForSound){ samples = mothershipSamples; num_samples = mothershipNumSamples; readyForSound = false; } } //draw mothership if mothershipSpawnCounter reached--------------------------------------------- if(!(mothershipTimer % mothershipSpawnCounter)){ globals_mothershipState = ALIVE; //set ship to alive mothershipTimer = 1;//initialize/reset timer write_mothership_to_memory(); //draw on screen } //stall deleting alien long enough to see explosion--------------------------------------------- if(beginAlienExplosion){ //stall till explosion done if(alienExplodeCounter < ALIEN_EXPLODE_TIME){ ++alienExplodeCounter; } if(alienExplodeCounter == ALIEN_EXPLODE_TIME){ write_alien_dead_to_memory(globals_alien); //erase explosion alienExplodeCounter = 1; //reset timer beginAlienExplosion = false; //end delay } } //killed mother ship stuff------------------------------------------------------------------------- if(beginMotherExplosion){ if(readyForSound){ samples = mothExplosionSamples; num_samples = mothExplosionNumSamples; readyForSound = false; } //draw 150 in place of mothership write_mothership_hit_score_to_memory(); //delay long enough for user to see if(alienExplodeCounter < MOTHERSHIP_EXPLODE_TIME){ ++alienExplodeCounter; } //delay limit reached if(alienExplodeCounter == MOTHERSHIP_EXPLODE_TIME){ write_mothership_black_to_memory(); //erase score alienExplodeCounter = 1; //reset counter beginMotherExplosion = false; //no longer exploding mothershipSpawnCounter = rand() % (MOTHERSHIP_MAX + 1 - MOTHERSHIP_MIN) + MOTHERSHIP_MIN;//make new spawn counter mothershipPosition = 0;//reset position } } //move alien block---------------------------------------------------------------------------- //if large amount of aliens are dead, move at fastest rate if(dead_alien_count > DEATH_FOR_FASEST){ if(!(timer%ALIEN_SPEED3)){ moveAlienBlock(); if(readyForSound){ samples = alienSamples; num_samples = alienNumSamples; readyForSound = false; } } } //if medium amount dead, move at medium speed else if(dead_alien_count > DEATH_FOR_MEDIUM){ if(!(timer%ALIEN_SPEED2)){ moveAlienBlock(); if(readyForSound){ samples = alienSamples; num_samples = alienNumSamples; readyForSound = false; } } //otherwise move at slowest rate }else{ if(!(timer%ALIEN_SPEED1)){ moveAlienBlock(); if(readyForSound){ samples = alienSamples; num_samples = alienNumSamples; readyForSound = false; } } } //update bullets-------------------------------------------------------------------------------- if(!(timer % BULLET_SPEED)){ updateBullets(); } //create new alien bullet----------------------------------------------------------------------- if(!(timer % (rand()%(ALIEN_BULLET_MAX+1-ALIEN_BULLET_MIN)+ALIEN_BULLET_MIN))){//new alien bullet from 2-5 seconds newAlienBullet(); } //inc mothership timer. Cannot overflow under correct operation--------------------------------- if(globals_mothershipState == DEAD) ++mothershipTimer;//mothership needs its own timer. Appears at unpredictable times } //inc timers------------------------------------------------------------------------------------- if(timer == UINT16_MAX){ timer = 1;//Reset timer to 1 so as not to mess up mod operations }else{ ++timer; } }
void disableButtonInterrupt(void) { xil_printf("\r\nDisabling button interrupts..."); XGpio_InterruptDisable(&pshBtns, lBtnChannel); XGpio_InterruptGlobalDisable(&pshBtns); xil_printf("done"); }