school project

Dependencies:   MMA8451Q mbed

main.cpp

Committer:
xlizne01
Date:
2016-01-13
Revision:
7:29f6c0e0b427
Parent:
6:5711a5b57d17
Child:
8:5f485026374d

File content as of revision 7:29f6c0e0b427:

#include "mbed.h"
#include "MMA8451Q.h"
 
#define MMA8451_I2C_ADDRESS (0x1d<<1)
#define MOVE_ANGLE 35   // > degrees for move 

//Ticker tick;

MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);

void accelerometer(void);  
void zobrazeni(void);
void barva(int,int);
void pohyb(void);
void proved(int);
void pridej(void);

 int i,j,k;
 int p=1;
 int RED, GREEN, BLUE;
 int RledA, RledB, GledA, GledB, BledA, BledB;
 float xAngle, yAngle;
 
 char acc_dir;
 
 int pole[4][4]={{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}};
 int pole2[4][4];

DigitalOut prvni(PTE5);
DigitalOut druhy(PTE4);
DigitalOut treti(PTE3);
DigitalOut ctvrty(PTE2);
DigitalOut paty(PTB11);
DigitalOut sesty(PTB10);
DigitalOut sedmy(PTB9);
DigitalOut osmy(PTB8);

DigitalOut Rled1(PTC9); 
DigitalOut Rled2(PTC8);
DigitalOut Rled3(PTA5);
DigitalOut Rled4(PTA4);
DigitalOut Rled5(PTA12);
DigitalOut Rled6(PTD4);
DigitalOut Rled7(PTA1);
DigitalOut Rled8(PTA2);

DigitalOut Gled1(PTA13);
DigitalOut Gled2(PTD5);
DigitalOut Gled3(PTD0);
DigitalOut Gled4(PTD2);
DigitalOut Gled5(PTD3);
DigitalOut Gled6(PTD1);
DigitalOut Gled7(PTE31);
DigitalOut Gled8(PTB0);

DigitalOut Bled1(PTC1);
DigitalOut Bled2(PTE29);
DigitalOut Bled3(PTC2);
DigitalOut Bled4(PTB3);
DigitalOut Bled5(PTB2);
DigitalOut Bled6(PTE21);
DigitalOut Bled7(PTE20);
DigitalOut Bled8(PTB1);

 
int main()
{      
//tick.attach(&zobrazeni, 0.01); // setup ticker to call zobrazeni
pridej();
pridej();

    while(1)
    { 
    accelerometer();
    pohyb();
    zobrazeni();
    }
}

void pridej()
{
    int f;
    int g=1;
    int suma=0;
    
    for(int a=0;a<4;a++)
    {
        for(int b=0;b<4;b++)
        {
            if(pole[a][b]==0)
            suma=1;
        } 
    }
    if(suma==1) // pridani cisla
    {
        accelerometer();
        xAngle=(xAngle*yAngle*100);
        f=int(xAngle)%16;
    
        while(g==1)
        { 
            f++;
            if(f==16)
            {
                f=0;
            }
            
            if(pole[f/4][f%4]==0)
            {
                pole[f/4][f%4]=2;
                g=0;
            }
        }
    }
}

   
   
        
void pohyb()
{
    switch(acc_dir)
    {
        case 'D': //pohyb smerem dolu
            if(p==0)
            {
                proved(1);
                p=1;
            }
            break;
            
        case 'R': // pohyb smerem vpravo
            if(p==0)
            {
                proved(2);
                p=1;
            }
            break;
            
        case 'U': // pohyb smerem nahoru
            if(p==0)
            {
                proved(3);
                p=1;
            }
            break;
            
        case 'L': // pohyb smerem vlevo
            if(p==0)
            {
                proved(4);
                p=1;
            }
            break;
            
        case '0': // detekovana nulova pozice
            p=0;
            break;
            
        default:
            break;  
    }
}

void proved(int x)
{
    int a,b,c,d,n;
    
    for(n=0;n<4;n++)
    {
        for(int k=0;k<4;k++)
        {
            for(int l=0;l<4;l++)
            {
                pole2[k][l]=pole[k][l];
            } 
        }
        
        if(x==1) // dolu
        {
            a=pole[n][0];
            b=pole[n][1];
            c=pole[n][2];
            d=pole[n][3];
        }
        
        if(x==2) // vpravo
        {
            a=pole[3][n];
            b=pole[2][n];
            c=pole[1][n];
            d=pole[0][n];
        }
        
        if(x==3) // nahoru
        {
            a=pole[n][3];
            b=pole[n][2];
            c=pole[n][1];
            d=pole[n][0];
        }
        
        if(x==4) // vlevo
        {
            a=pole[0][n];
            b=pole[1][n];
            c=pole[2][n];
            d=pole[3][n];
        }
        
        //sesypani
        if(a==0)
            {a=b; b=c; c=d; d=0;}
        if(a==0)
            {a=b; b=c; c=d; d=0;}
        if(a==0)
            {a=b; b=c; c=d; d=0;}
        if(b==0)
            {b=c; c=d; d=0;}
        if(b==0)
            {b=c; c=d; d=0;}
        if(c==0)
            {c=d; d=0;}
           
           //spojeni 
        if(a==b)
            {a=2*a; b=c; c=d; d=0;}
        if(b==c)
            {b=2*b; c=d; d=0;}
        if(c==d)
            {c=2*c; d=0;}
         
        if(x==1) // dolu
        {   
            pole[n][0]=a;
            pole[n][1]=b;
            pole[n][2]=c;
            pole[n][3]=d;
        }
        if(x==2) // vpravo
        {   
            pole[3][n]=a;
            pole[2][n]=b;
            pole[1][n]=c;
            pole[0][n]=d;
        }
        
        if(x==3) // nahoru
        {   
            pole[n][3]=a;
            pole[n][2]=b;
            pole[n][1]=c;
            pole[n][0]=d;
        }
        
        if(x==4) // vlevo
        {   
            pole[0][n]=a;
            pole[1][n]=b;
            pole[2][n]=c;
            pole[3][n]=d;
        }      
    }
    pridej();
}

void zobrazeni()
{
    for(k=0;k<4;k++)
    {  
        prvni=0;
        druhy=0;
        treti=0;
        ctvrty=0;
        paty=0;
        sesty=0;
        sedmy=0;
        osmy=0;
        
        wait(0.00005); //proti tzv. duchum
        
        if(k==0)
        {
        prvni=1;
        druhy=1;
        }
    
        if(k==1)
        {
        treti=1;
        ctvrty=1;
        }
    
        if(k==2)
        {
        paty=1;
        sesty=1;
        }
    
        if(k==3)
        {
        sedmy=1;
        osmy=1;
        }
    
        for(j=0;j<4;j++)
        { 
        
        barva(j,k);
                
            for(i=11;i>0;i--)
            {
                if(RED>0)
                {
                RledA=1;
                RledB=1;
                }
                else
                {
                RledA=0;
                RledB=0;
                }
            
                if(GREEN>0)
                {
                GledA=1;
                GledB=1;
                }
                else
                {
                GledA=0;
                GledB=0;
                }
                    
                if(BLUE>0)
                {
                BledA=1;
                BledB=1;
                }
                else
                {
                BledA=0;
                BledB=0;
                }
        
                if(j==0)
                {
                Rled1=RledA;
                Rled2=RledB;
                Gled1=GledA;
                Gled2=GledB;
                Bled1=BledA;
                Bled2=BledB;
                }
                
                if(j==1)
                {
                Rled3=RledA;
                Rled4=RledB;
                Gled3=GledA;
                Gled4=GledB;
                Bled3=BledA;
                Bled4=BledB;
                }
                
                if(j==2)
                {
                Rled5=RledA;
                Rled6=RledB;
                Gled5=GledA;
                Gled6=GledB;
                Bled5=BledA;
                Bled6=BledB;
                }
                
                if(j==3)
                {
                Rled7=RledA;
                Rled8=RledB;
                Gled7=GledA;
                Gled8=GledB;
                Bled7=BledA;
                Bled8=BledB;
                } 
                
                wait(0.00001);
                RED--;
                BLUE--;
                GREEN--;  
            }    
        }
    } 
} 

void barva(int j , int k)
{
    if(pole[j][k]==0)
    {
    RED=0;
    GREEN=0;
    BLUE=0;
    }
    if(pole[j][k]==2)
    {
    RED=2;
    GREEN=0;
    BLUE=0;
    }
    if(pole[j][k]==4)
    {
    RED=10;
    GREEN=0;
    BLUE=0;
    }
    if(pole[j][k]==8)
    {
    RED=0;
    GREEN=0;
    BLUE=2;
    }
    if(pole[j][k]==16)
    {
    RED=0;
    GREEN=0;
    BLUE=10;
    }
    if(pole[j][k]==32)
    {
    RED=0;
    GREEN=2;
    BLUE=0;
    }
    if(pole[j][k]==64)
    {
    RED=0;
    GREEN=10;
    BLUE=0;
    }
    if(pole[j][k]==128)
    {
    RED=0;
    GREEN=10;
    BLUE=10;
    }
    if(pole[j][k]==256)
    {
    RED=10;
    GREEN=0;
    BLUE=10;
    }
    if(pole[j][k]==512)
    {
    RED=10;
    GREEN=10;
    BLUE=0;
    }
    if(pole[j][k]==1024)
    {
    RED=2;
    GREEN=2;
    BLUE=2;
    }
    if(pole[j][k]==2048)
    {
    RED=10;
    GREEN=10;
    BLUE=10;
    }    
}


void accelerometer()
{
    float ax, ay, az;

    ax = acc.getAccX();
    ay = acc.getAccY();
    az = acc.getAccZ();
        
    xAngle = atan( ax / (sqrt((ay)*(ay) + (az)*(az)))) * 60;
    yAngle = atan( ay / (sqrt((ax)*(ax) + (az)*(az)))) * 60;
        
        
    if((abs(xAngle)+abs(yAngle))<15)
    {
    acc_dir = '0';   // nula
    }
        
         
    if(abs(xAngle) >= abs(yAngle))
    {
        if(xAngle >= MOVE_ANGLE)
        {                 
        acc_dir = 'U';   // +X 
        }
           
        if(xAngle <= -MOVE_ANGLE)
        {
        acc_dir = 'D';    // -X  
        }   
    }
    else
    {      
        if(yAngle >= MOVE_ANGLE)
        {
        acc_dir = 'L';   // +Y 
        }
    
        if(yAngle <= -MOVE_ANGLE)
        {
        acc_dir = 'R';   // -Y  
        }   
    }        
}