Václav Lízner
/
2048
school project
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 } } }