Select Git revision
laboProj_NoIterrupt.cpp
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();
}
}