Nicolas Gonzalez gil / Mbed 2 deprecated Tetris

Dependencies:   mbed MPU6050

main.cpp

Committer:
Nicolas_11
Date:
2018-11-23
Revision:
2:5faf2fd6c613
Parent:
0:cf64daf01e11

File content as of revision 2:5faf2fd6c613:

#include "mbed.h"
#include "MPU6050.h"
SPI deviceM(PB_15, PB_14, PB_13);
DigitalOut ssel (PB_12);
Serial a(USBTX,USBRX);

MPU6050 mpu1(PB_9,PB_8);


#define  uint8_t unsigned char
int Tipofig=0;
int vcol;
float Vel=0.8;
int grado=0;
float value_accelerox;
float value_acceleroy;
int in,out;
int lim;
int lim2;
int m;
int hhh;
int col2;
int rot;
int pos_x;
int pos_y;
int juego=1;
uint8_t Matr[9]={0,0,0,0,0,0,0,0,0};
uint8_t F_t[3]={0b11100000,0b01000000,0};
uint8_t F_s[3]={0b11000000,0b01100000,0};
uint8_t F_c[3]={0b11000000,0b11000000,0};
uint8_t F_l[3]={0b11000000,0b10000000,0b10000000};
uint8_t F_I[3]={0b10000000,0b10000000,0b10000000};
uint8_t Fig[3]={0,0,0};
int poscol;



 
void seleccion(uint8_t sc);
void giro(uint8_t gi);
void save(uint8_t *vC,uint8_t  col);
void imprimir();
void Izq();
void Der();
void accelerometro();
void tetris();


void sendSPI(uint8_t d1, uint8_t d2)
{
    deviceM.unlock();
    ssel=0;
    deviceM.write(d1); 
    deviceM.write(d2);  
    ssel=1;
    deviceM.lock(); 
}
   
void borrar()
{
 for(int i;i<=8;i++)   {
     sendSPI(i,0);
     }
}
   
void inicializar(){
                
                    a.baud(9600);
                    sendSPI(0x0c,1);
                    sendSPI(0x09,0);
                    sendSPI(0x0A,0x01);
                    sendSPI(0x0F,1);
                    wait (0.5);
                    sendSPI(0x0F,0);
                    wait(0.5);
                    sendSPI(0xB,0x7);   
                    mpu1.setAcceleroRange('MPU6050_ACCELERO_RANGE_4G'); 
                    borrar();
    }
    
void seleccion(uint8_t sc){
        switch(sc) {           
                    case 1: Fig[0]=F_t[0]; Fig[1]=F_t[1];Fig[2]=F_t[2]; break;
                    case 2: Fig[0]=F_s[0]; Fig[1]=F_s[1];Fig[2]=F_s[2]; break;
                    case 3: Fig[0]=F_c[0]; Fig[1]=F_c[1];Fig[2]=F_c[2]; break;
                    case 4: Fig[0]=F_l[0]; Fig[1]=F_l[1];Fig[2]=F_l[2]; break;
                    case 5: Fig[0]=F_I[0]; Fig[1]=F_I[1];Fig[2]=F_I[2]; break;
                    default:break;}
    }      

void giro(uint8_t gi)
     {  
     int i;
     int j;
     int k;
     uint8_t vec_aux[3]={0,0,0};
         switch(gi){
         case 1:         
         break;      
         case 2:
         for(j=0;j<3;j++){
            for(i=0;i<3;i++){
             vec_aux[i]=(((((Fig[j]))<<2-i)&0b10000000)>>j)+vec_aux[i];
            }
         }         
             for(k=0;k<3;k++){Fig[k]=vec_aux[k];}
                                 
         break;
         case 3:
         for(j=0;j<3;j++){
            for(i=0;i<3;i++){
             vec_aux[i]=(((((Fig[2-i]))>>2-j)&0b00100000)<<j)+vec_aux[i];
            }
            }
                   for(k=0;k<3;k++){Fig[k]=vec_aux[k];}
         break;
         case 4:
         for(j=0;j<3;j++){
            for(i=0;i<3;i++){
             vec_aux[i]= ( ( ((Fig[j])>>2-i) & (0b00100000) )<<j )+vec_aux[i];
            }
          }
                for(k=0;k<3;k++){Fig[k]=vec_aux[k];}
         break;
         default:
         break;
         }  
 
     }



void limite(uint8_t *sc,uint8_t trasladar)
{
    int i;
    int f;
    uint8_t t;
    for(i=1;i<=8;i++)
    {   
        t=(Fig[0])>>(trasladar-1);
        if(i>7){f=(*(sc+(8)))&(t);break;}
        
        else{f=(*(sc+(i+1)))&(t);}
              
        if(f>0){lim=i;break;}    
        else{lim=8;} 
    }  
    a.printf("\n stop de fila \n %d",i);
    a.printf("\n limite \n %d",lim);
}

void imprimir(uint8_t  colum)
{  
   
    if(col2>6){col2=6;}
    
    uint8_t dat [8];
    int i;
    //int verif=0;
    int aux;

    limite(Matr,colum);
    
    for(i=1;i<=lim;i++){
             accelerometro();
            a.printf("valor columna %d\n",col2);
            /* if(verif == pos_x ){aux=1;}
             else{
              aux=0;
                 if(pos_x==3){col2--;if(col2<2){col2=1;}}     
                 if(pos_x==1){col2++;if(col2>=6){col2=6;}}   
                  a.printf("chichico\n");
               }
             if(aux == 0){verif=pos_x;aux=1;}
             */
                 if(pos_x==3){col2--;if(col2<2){col2=1;}}     
                 if(pos_x==1){col2++;if(col2>=6){col2=6;}}
                 if(value_acceleroy>3){grado++;if(grado>4){grado=1;}giro(grado);} 
             if(i>=1){
             dat[1]=((Fig[0])>>col2-1) ;
             dat[2]=((Fig[1])>>col2-1) ;
             dat[3]=((Fig[2])>>col2-1) ;
             uint8_t e=~((0b11100000)>>col2-1);
             Matr[i]=dat[1] | Matr[i];
             Matr[i-1]=((dat[2] | Matr[i-1])&(dat[2]|e));
             Matr[i-2]=((dat[3] | Matr[i-2])&(dat[3]|e));
             if(i>3){Matr[i-3]=Matr[i-3]& e;}
             sendSPI(i,(Matr[i]));
             sendSPI(i-1,(Matr[i-1]));
             sendSPI(i-2,(Matr[i-2]));
             sendSPI((i-3),(Matr[i-3]));
             wait(Vel);  
             }
    }   
}
/*
void tetris(){
    while(1){           
                     
                        in=a.getc();
                        Tipofig=a.getc();
                        //vcol=a.getc();
                        grado=a.getc();
                        out=a.getc();
                        vcol=rand()%7 +1;
                        if(in==60 && Tipofig<=5  && grado<=4 && out==62){
                          seleccion(Tipofig);
                          giro(grado);
                          imprimir(vcol);
                        
                        }
                        else{
                            if(juego==2){break;}
                            break;
                            }
                    
           }
    }
*/


int main() {

                    inicializar(); 
 
                    while(1){
                         in=a.getc();
                        Tipofig=a.getc();
                        vcol=a.getc();
                        grado=a.getc();
                        out=a.getc();
                        //vcol=rand()%7 +1;
                        if(in==60 && Tipofig<=5 && vcol<7  && grado<=4 && out==62){
                          seleccion(Tipofig);
                          giro(grado);
                          imprimir(vcol);
                     
                        }
                        else{
                            break;
                            }
                    }
}


void accelerometro(){
    
     float accelero[3]; 
     mpu1.getAccelero(accelero);
     value_accelerox = accelero[1];
     value_acceleroy = accelero[0];
         if(value_accelerox>-9 && value_accelerox<-2){//a.printf("valor acelerometro 1 %f\n",value_accelerox);              a.printf("valor1 pos_x %d\n",col2);

           pos_x=1;}
         if(value_accelerox>-1 && value_accelerox<3){//a.printf("valor acelerometro  2 %f\n",value_accelerox);              a.printf("valor2 pos_x %d\n",col2);

           pos_x=2;}
         if(value_accelerox>3 && value_accelerox<9){//a.printf("valor acelerometro  3 %f\n",value_accelerox);              a.printf("valor2 pos_x %d\n",col2);

           pos_x=3;}
           
         if(value_acceleroy>3){//a.printf("valor acelerometro  3 %f\n",value_acceleroy);              
           pos_y=1;} 
    }