Skip to content
Snippets Groups Projects
Select Git revision
  • main
1 result

laboProj_NoIterrupt.cpp

Blame
  • laboProj_NoIterrupt.cpp 4.57 KiB
    /*
     * labo4.cpp
     *
     *  Created on: 14/12/2022
     *      Author: Gabriel Marino Jarrin
     */
    
    #include "connect4.hpp"
    #include "mbed.h"
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    #include "pixel.hpp"
    
    // I2C i2c(P0_0, P0_1);
    BusOut LEDs_Red(P2_4, P2_5, P2_6, P2_7, P2_8, P2_10, P2_11, P2_12);
    BusOut LEDs_Green(P2_3, P2_2, P2_1, P2_0, P0_11, P0_10, P0_5, P0_4);
    BusOut LEDs_Blue(P0_17, P0_18, P0_1, P0_0, P0_6, P0_7, P0_8, P0_9);
    BusOut Transistors(P0_15, P0_16, P0_23, P0_24, P0_25, P0_26, P1_30, P1_31);
    
    I2C i2c(P0_27, P0_28);
    bool flagInterrupt = false;
    bool btnMaintenu = false;
    
    Tile currPlayer = PLAYER1;
    int gameBoard[WIDTH][HEIGHT];
    pixel LEDBoard[WIDTH][HEIGHT];
    
    Ticker winTicker;
    int tickCount = 0;
    
    bool* P1_Color = C_BLUE;
    bool* P2_Color = C_MAGENTA;
    
    void turnOffAllLights(){
    	for (int i = 0; i < HEIGHT; i++)
    	{
    		Transistors[i] = 0;
    	    for (int j = 0; j < WIDTH; j++)
    	    {
    	        LEDs_Red[j] = 0;
    	        LEDs_Green[j] = 0;
    	        LEDs_Blue[j] = 0;
    	    }
    	}
    }
    
    void initLEDS()
    {
        for (int i = 0; i < HEIGHT; i++)
        {
            for (int j = 0; j < WIDTH; j++)
            {
                setColor(&LEDBoard[i][j], C_BLACK);
            }
        }
    }
    
    int whichBtnPressed(){
    	i2c.start();
    	i2c.write(0x1c<<1);
    	i2c.write(3);
    	i2c.stop();
    
    	i2c.start();
    	i2c.write((0x1c<<1) + 0x1);
    
    	int val1 = (int)i2c.read(1);
    	int val2 = (int)i2c.read(0);
    
    	i2c.stop();
    
    	switch(val1+val2){
    	case 1:
    		return 4;
    	case 2:
    		return 5;
    	case 4:
    		return 6;
    	case 8:
    		return 7;
    	case 16:
    		return 0;
    	case 32:
    		return 1;
    	case 64:
    		return 2;
    	case 128:
    		return 3;
    	default :
    		return -1;
    	}
    }
    
    void displayGame(){
    	turnOffAllLights();
    	for(int i = 0; i < HEIGHT; i++){
    		Transistors = 1<<i;
    	    for(int j = 0; j < WIDTH; j++){
    	    	if(gameBoard[i][j] == PLAYER1){
    	    		//LEDBoard[i][j] = pixel(P1_Color);
    	    		setColor(&LEDBoard[i][j], P1_Color);
    	    	}
    	    	else if(gameBoard[i][j] == PLAYER2){
    	    		//LEDBoard[i][j] = pixel(P2_Color);
    	    		setColor(&LEDBoard[i][j], P2_Color);
    	    	}
    	    	else{
    	    		//LEDBoard[i][j] = pixel(C_BLACK);
    	    		setColor(&LEDBoard[i][j], C_BLACK);
    	    	}
    	    	/* ça devrait régler le prob des 2 leds qui s'allument mais fait bug interrupt*/
    	    	LEDs_Red.write(0);
    	    	LEDs_Green.write(0);
    	    	LEDs_Blue.write(0);
    	    	 /**/
    	    	//Transistors.write(1<<i);
    
    
    	        if(LEDBoard[i][j].r){
    	            LEDs_Red.write(1<<j);
    	        	//LEDs_Red[j] = 1;
    	        }
    	        if(LEDBoard[i][j].g){
    	            LEDs_Green.write(1<<j);
    	        	//LEDs_Green[j] = 1;
    	        }
    	        if(LEDBoard[i][j].b){
    	            LEDs_Blue.write(1<<j);
    	        	//LEDs_Blue[j] = 1;
    	        }
    	    }
    	    Transistors[i] = 0x00;
    	}
    }
    
    void showWinnerScreen(Tile winner){
    	for(int i = 0; i < HEIGHT; i++){
    		Transistors = 1<<i;
    		for(int j = 0; j < WIDTH; j++){
    		    if(gameBoard[i][j] == winner){
    		    	if(winner == PLAYER1)
    		    		setColor(&LEDBoard[i][j], P1_Color);
    		    	else
    		    		setColor(&LEDBoard[i][j], P2_Color);
    		    }
    		    else{
    		    	setColor(&LEDBoard[i][j], C_BLACK);
    		    }
    
    		    LEDs_Red.write(0);
    		    LEDs_Green.write(0);
    		    LEDs_Blue.write(0);
    
    	        if(LEDBoard[i][j].r){
    	            LEDs_Red.write(1<<j);
    	        }
    		    if(LEDBoard[i][j].g){
    		       LEDs_Green.write(1<<j);
    		    }
    		    if(LEDBoard[i][j].b){
    		    	LEDs_Blue.write(1<<j);
    		    }
    		}
    		    Transistors[i] = 0x00;
    	}
    }
    
    void tickerWinnerAction(){
    	showWinnerScreen(currPlayer);
    	tickCount++;
    	if(tickCount >= 2555){
    		initBoard(gameBoard);
    		initLEDS();
    		winTicker.detach();
    		tickCount = 0;
    	}
    }
    
    void updateGame(int indexPlayed){
    	placePiece(gameBoard, indexPlayed, currPlayer);
    	Tile possibleWinner = checkWin(gameBoard);
    	if(possibleWinner != EMPTY){
    		if(possibleWinner == PLAYER1)
    			currPlayer = PLAYER2;
    		else
    			currPlayer = PLAYER1;
    		winTicker.attach(&tickerWinnerAction, 0.001);
    	}
    }
    
    void btnPressed(){
    	flagInterrupt = true;
    }
    
    void flush()
    {
    	while(1){
    		i2c.start();
    		i2c.write(0x1c<<1);
    		i2c.write(2);
    		i2c.stop();
    		i2c.start();
    		i2c.write((0x1c<<1) + 0x1);
    		int status_val = (int)i2c.read(1);
    		i2c.stop();
    		if((status_val & 0x01) == 0){
    			return;
    		}
    	}
    }
    int main(void) {
    	flush();
    
    	initBoard(gameBoard);
    	initLEDS();
    	int lastIndexPressed = -1;
    	while(1){
    		int indexBtnPressed = whichBtnPressed();
    		if(indexBtnPressed != -1){
    			lastIndexPressed = indexBtnPressed;
    			btnMaintenu = true;
    		}
    		if(indexBtnPressed == -1 && btnMaintenu){
    			updateGame(lastIndexPressed);
    			if(currPlayer == PLAYER1){
    				currPlayer = PLAYER2;
    			}
    			else{
    				currPlayer = PLAYER1;
    			}
    			flush();
    			lastIndexPressed = -1;
    			btnMaintenu = false;
    		}
    		indexBtnPressed = -1;
    		displayGame();
    	}
    }